1//
2// Copyright (C) 2016 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 TPM_MANAGER_SERVER_BINDER_SERVICE_H_
18#define TPM_MANAGER_SERVER_BINDER_SERVICE_H_
19
20#include <brillo/binder_watcher.h>
21#include <brillo/daemons/daemon.h>
22
23#include "android/tpm_manager/BnTpmNvram.h"
24#include "android/tpm_manager/BnTpmOwnership.h"
25#include "tpm_manager/common/tpm_nvram_interface.h"
26#include "tpm_manager/common/tpm_ownership_interface.h"
27
28namespace tpm_manager {
29
30// BinderService registers for and handles all incoming binder calls for the
31// tpm_managerd system daemon.
32//
33// Example Usage:
34//
35// BinderService service(&nvram_service, &ownership_service);
36// service.Run();
37class BinderService : public brillo::Daemon {
38 public:
39  BinderService(TpmNvramInterface* nvram_service,
40                TpmOwnershipInterface* ownership_service);
41  ~BinderService() override = default;
42
43  // Does basic setup but does not register with the binder subsystem.
44  void InitForTesting();
45
46  // Getters for binder interfaces. Callers do not take ownership. These should
47  // only be used for testing.
48  android::tpm_manager::ITpmNvram* GetITpmNvram();
49  android::tpm_manager::ITpmOwnership* GetITpmOwnership();
50
51 protected:
52  int OnInit() override;
53
54 private:
55  friend class NvramServiceInternal;
56  class NvramServiceInternal : public android::tpm_manager::BnTpmNvram {
57   public:
58    explicit NvramServiceInternal(TpmNvramInterface* service);
59    ~NvramServiceInternal() override = default;
60
61    // ITpmNvram interface.
62    android::binder::Status DefineSpace(
63        const std::vector<uint8_t>& command_proto,
64        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
65        override;
66    android::binder::Status DestroySpace(
67        const std::vector<uint8_t>& command_proto,
68        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
69        override;
70    android::binder::Status WriteSpace(
71        const std::vector<uint8_t>& command_proto,
72        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
73        override;
74    android::binder::Status ReadSpace(
75        const std::vector<uint8_t>& command_proto,
76        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
77        override;
78    android::binder::Status ListSpaces(
79        const std::vector<uint8_t>& command_proto,
80        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
81        override;
82    android::binder::Status GetSpaceInfo(
83        const std::vector<uint8_t>& command_proto,
84        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
85        override;
86    android::binder::Status LockSpace(
87        const std::vector<uint8_t>& command_proto,
88        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
89        override;
90
91   private:
92    TpmNvramInterface* nvram_service_;
93  };
94
95  friend class OwnershipServiceInternal;
96  class OwnershipServiceInternal : public android::tpm_manager::BnTpmOwnership {
97   public:
98    explicit OwnershipServiceInternal(TpmOwnershipInterface* service);
99    ~OwnershipServiceInternal() override = default;
100
101    // ITpmOwnership interface.
102    android::binder::Status GetTpmStatus(
103        const std::vector<uint8_t>& command_proto,
104        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
105        override;
106    android::binder::Status TakeOwnership(
107        const std::vector<uint8_t>& command_proto,
108        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
109        override;
110    android::binder::Status RemoveOwnerDependency(
111        const std::vector<uint8_t>& command_proto,
112        const android::sp<android::tpm_manager::ITpmManagerClient>& client)
113        override;
114
115   private:
116    TpmOwnershipInterface* ownership_service_;
117  };
118
119  brillo::BinderWatcher watcher_;
120  android::sp<NvramServiceInternal> nvram_binder_;
121  android::sp<OwnershipServiceInternal> ownership_binder_;
122  TpmNvramInterface* nvram_service_;
123  TpmOwnershipInterface* ownership_service_;
124
125  DISALLOW_COPY_AND_ASSIGN(BinderService);
126};
127
128}  // namespace tpm_manager
129
130#endif  // TPM_MANAGER_SERVER_BINDER_SERVICE_H_
131