1bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
2bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Copyright (C) 2014 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//
1603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
1703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/trunks_factory_impl.h"
1803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
199caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#include <base/logging.h>
2030c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez#include <base/memory/ptr_util.h>
219caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn
220ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi#include "trunks/blob_parser.h"
23ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/hmac_session_impl.h"
2403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/password_authorization_delegate.h"
25ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/policy_session_impl.h"
26ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi#include "trunks/session_manager_impl.h"
2703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/tpm_generated.h"
2803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/tpm_state_impl.h"
2903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "trunks/tpm_utility_impl.h"
309caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#if defined(USE_BINDER_IPC)
319caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#include "trunks/trunks_binder_proxy.h"
329caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#else
339caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#include "trunks/trunks_dbus_proxy.h"
349caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#endif
3503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
3603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahnnamespace trunks {
3703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
38b180754b429c078cbc99175a6059a8b5d0491002Darren KrahnTrunksFactoryImpl::TrunksFactoryImpl() {
399caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#if defined(USE_BINDER_IPC)
409caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn  default_transceiver_.reset(new TrunksBinderProxy());
419caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#else
429caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn  default_transceiver_.reset(new TrunksDBusProxy());
439caf492818a4cc51ba471534d3fcaa84c9ce0278Darren Krahn#endif
44de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi  transceiver_ = default_transceiver_.get();
4503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
4603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
47de1659944c1d4291aa67f9582990110e11c8461eUtkarsh SanghiTrunksFactoryImpl::TrunksFactoryImpl(CommandTransceiver* transceiver) {
48de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi  transceiver_ = transceiver;
4903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
5003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
51de1659944c1d4291aa67f9582990110e11c8461eUtkarsh SanghiTrunksFactoryImpl::~TrunksFactoryImpl() {}
52de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi
53b180754b429c078cbc99175a6059a8b5d0491002Darren Krahnbool TrunksFactoryImpl::Initialize() {
54b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  if (initialized_) {
55b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    return true;
56b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  }
57b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  tpm_.reset(new Tpm(transceiver_));
58b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  if (transceiver_ != default_transceiver_.get()) {
59b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    initialized_ = true;
60b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  } else {
61b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    initialized_ = transceiver_->Init();
62b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    if (!initialized_) {
63b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn      LOG(WARNING) << "Failed to initialize the trunks IPC proxy; "
64b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn                   << "trunksd is not ready.";
65b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn    }
66b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  }
67b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn  return initialized_;
68b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn}
69b180754b429c078cbc99175a6059a8b5d0491002Darren Krahn
7003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren KrahnTpm* TrunksFactoryImpl::GetTpm() const {
71de1659944c1d4291aa67f9582990110e11c8461eUtkarsh Sanghi  return tpm_.get();
7203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
7303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
7430c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<TpmState> TrunksFactoryImpl::GetTpmState() const {
7530c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<TpmStateImpl>(*this);
7603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
7703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
7830c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<TpmUtility> TrunksFactoryImpl::GetTpmUtility() const {
7930c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<TpmUtilityImpl>(*this);
8003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
8103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
8230c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<AuthorizationDelegate>
8330c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector ChavezTrunksFactoryImpl::GetPasswordAuthorization(const std::string& password) const {
8430c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<PasswordAuthorizationDelegate>(password);
8503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}
8603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
8730c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<SessionManager> TrunksFactoryImpl::GetSessionManager() const {
8830c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<SessionManagerImpl>(*this);
89ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
90ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
9130c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<HmacSession> TrunksFactoryImpl::GetHmacSession() const {
9230c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<HmacSessionImpl>(*this);
93ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi}
94ff7f2da556b21253a52abbc82e7cf7bee54a850eUtkarsh Sanghi
9530c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<PolicySession> TrunksFactoryImpl::GetPolicySession() const {
9630c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<PolicySessionImpl>(*this, TPM_SE_POLICY);
97be41115c49f10e8b81ae27963dfebb893c98f06aUtkarsh Sanghi}
98be41115c49f10e8b81ae27963dfebb893c98f06aUtkarsh Sanghi
9930c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<PolicySession> TrunksFactoryImpl::GetTrialSession() const {
10030c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<PolicySessionImpl>(*this, TPM_SE_TRIAL);
10152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
10252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
10330c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavezstd::unique_ptr<BlobParser> TrunksFactoryImpl::GetBlobParser() const {
10430c921db09d27768acc1ea0d8b6a9c8e814f931aLuis Hector Chavez  return base::MakeUnique<BlobParser>();
1050ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi}
1060ebbc58fe6d45378a5b502c33eb1c4289fd8b05bUtkarsh Sanghi
10703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn}  // namespace trunks
108