1bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
2bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Copyright (C) 2015 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//
16ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
17ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/session_manager_impl.h"
18ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
19ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include <vector>
20ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
219caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#include <base/logging.h>
22ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include <base/strings/string_number_conversions.h>
23ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include <gmock/gmock.h>
24ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include <gtest/gtest.h>
25ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
269caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#include "trunks/error_codes.h"
27ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/mock_tpm.h"
28ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/tpm_generated.h"
29ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/tpm_utility.h"
30ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/trunks_factory_for_test.h"
31ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
32ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiusing testing::_;
33ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiusing testing::DoAll;
34ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiusing testing::NiceMock;
35ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiusing testing::Return;
36ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiusing testing::SetArgPointee;
37ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
38ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghinamespace trunks {
39ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
40ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghiclass SessionManagerTest : public testing::Test {
41ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi public:
42ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  SessionManagerTest() : session_manager_(factory_) {
43ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    delegate_ = new HmacAuthorizationDelegate();
44ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
45ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  ~SessionManagerTest() override {}
46ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
47ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  void SetUp() override {
48ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    factory_.set_tpm(&mock_tpm_);
49ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
50ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
51ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  void SetHandle(TPM_HANDLE handle) {
52ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    session_manager_.session_handle_ = handle;
53ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
54ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
55ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM2B_PUBLIC_KEY_RSA GetValidRSAPublicKey() {
56ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    const char kValidModulus[] =
57ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi        "A1D50D088994000492B5F3ED8A9C5FC8772706219F4C063B2F6A8C6B74D3AD6B"
58ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi        "212A53D01DABB34A6261288540D420D3BA59ED279D859DE6227A7AB6BD88FADD"
59ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi        "FC3078D465F4DF97E03A52A587BD0165AE3B180FE7B255B7BEDC1BE81CB1383F"
60ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi        "E9E46F9312B1EF28F4025E7D332E33F4416525FEB8F0FC7B815E8FBB79CDABE6"
61ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi        "327B5A155FEF13F559A7086CB8A543D72AD6ECAEE2E704FF28824149D7F4E393"
62ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi        "D3C74E721ACA97F7ADBE2CCF7B4BCC165F7380F48065F2C8370F25F066091259"
63ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi        "D14EA362BAF236E3CD8771A94BDEDA3900577143A238AB92B6C55F11DEFAFB31"
64ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi        "7D1DC5B6AE210C52B008D87F2A7BFF6EB5C4FB32D6ECEC6505796173951A3167";
659caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn    std::vector<uint8_t> bytes;
66ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    CHECK(base::HexStringToBytes(kValidModulus, &bytes));
67ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    CHECK_EQ(bytes.size(), 256u);
68ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    TPM2B_PUBLIC_KEY_RSA rsa;
69ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    rsa.size = bytes.size();
70ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    memcpy(rsa.buffer, bytes.data(), bytes.size());
71ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi    return rsa;
72ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  }
73ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
74ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi protected:
75ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TrunksFactoryForTest factory_;
76ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  NiceMock<MockTpm> mock_tpm_;
77ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  HmacAuthorizationDelegate* delegate_;
78ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  SessionManagerImpl session_manager_;
79ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi};
80ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
81ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh SanghiTEST_F(SessionManagerTest, CloseSessionSuccess) {
82ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_HANDLE handle = TPM_RH_FIRST;
83ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  SetHandle(handle);
84c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, FlushContextSync(handle, nullptr))
85ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .WillOnce(Return(TPM_RC_SUCCESS));
86ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  session_manager_.CloseSession();
87ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
88ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
89ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh SanghiTEST_F(SessionManagerTest, CloseSessionNoHandle) {
90ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_HANDLE handle = kUninitializedHandle;
91ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  SetHandle(handle);
92c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, FlushContextSync(handle, nullptr))
93ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .Times(0);
94ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  session_manager_.CloseSession();
95ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
96ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
97ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh SanghiTEST_F(SessionManagerTest, GetSessionHandleTest) {
98ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_HANDLE handle = TPM_RH_FIRST;
99ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_EQ(kUninitializedHandle, session_manager_.GetSessionHandle());
100ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  SetHandle(handle);
101ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_EQ(handle, session_manager_.GetSessionHandle());
102ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
103ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
104ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
105ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh SanghiTEST_F(SessionManagerTest, StartSessionSuccess) {
106ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_SE session_type = TPM_SE_TRIAL;
107ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM2B_PUBLIC public_data;
108ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  public_data.public_area.unique.rsa = GetValidRSAPublicKey();
109c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, nullptr))
110ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(public_data),
111ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
112ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_HANDLE handle = TPM_RH_FIRST;
113ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM2B_NONCE nonce;
114ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  nonce.size = 20;
115ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, StartAuthSessionSyncShort(_, handle,
116ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                   _, _, session_type, _, _,
117ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                   _, _, _))
118ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<8>(nonce),
119ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
120ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_EQ(TPM_RC_SUCCESS, session_manager_.StartSession(session_type,
121ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                          handle, "", false,
122ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                          delegate_));
123ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
124ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
125ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh SanghiTEST_F(SessionManagerTest, StartSessionBadSaltingKey) {
126ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM2B_PUBLIC public_data;
127ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  public_data.public_area.unique.rsa.size = 32;
128c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, nullptr))
129ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(public_data),
130ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
1319caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn  EXPECT_EQ(TRUNKS_RC_SESSION_SETUP_ERROR,
1329caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn            session_manager_.StartSession(TPM_SE_TRIAL, TPM_RH_NULL, "", false,
1339caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn                                          delegate_));
134ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
135ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
136ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh SanghiTEST_F(SessionManagerTest, StartSessionFailure) {
137ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM2B_PUBLIC public_data;
138ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  public_data.public_area.unique.rsa = GetValidRSAPublicKey();
139c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, nullptr))
140ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(public_data),
141ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
142ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, StartAuthSessionSyncShort(_,
143ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                   TPM_RH_NULL,
144ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                   _, _, _, _, _, _, _, _))
145ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .WillOnce(Return(TPM_RC_FAILURE));
146ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, session_manager_.StartSession(TPM_SE_TRIAL,
147ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                          TPM_RH_NULL, "",
148ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                          false, delegate_));
149ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
150ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
151ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh SanghiTEST_F(SessionManagerTest, StartSessionBadNonce) {
152ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_SE session_type = TPM_SE_TRIAL;
153ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM2B_PUBLIC public_data;
154ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  public_data.public_area.unique.rsa = GetValidRSAPublicKey();
155c04decde2a6e9b74395f402818852e752534254bUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, ReadPublicSync(kSaltingKey, _, _, _, _, nullptr))
156ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<2>(public_data),
157ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
158ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM_HANDLE handle = TPM_RH_FIRST;
159ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  TPM2B_NONCE nonce;
160ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  nonce.size = 0;
161ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_CALL(mock_tpm_, StartAuthSessionSyncShort(_, handle,
162ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                   _, _, session_type, _, _,
163ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                   _, _, _))
164ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi      .WillOnce(DoAll(SetArgPointee<8>(nonce),
165ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                      Return(TPM_RC_SUCCESS)));
166ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi  EXPECT_EQ(TPM_RC_FAILURE, session_manager_.StartSession(session_type,
167ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                          handle, "", false,
168ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi                                                          delegate_));
169ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
170ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
171ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}  // namespace trunks
172