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