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