• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3  * Licensed under the Mulan PSL v2.
4  * You can use this software according to the terms and conditions of the Mulan PSL v2.
5  * You may obtain a copy of Mulan PSL v2 at:
6  *     http://license.coscl.org.cn/MulanPSL2
7  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8  * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9  * PURPOSE.
10  * See the Mulan PSL v2 for more details.
11  */
12 
13 #ifndef CA_DAEMON_SERVICE_H
14 #define CA_DAEMON_SERVICE_H
15 
16 #include <cstdint>
17 #include <cstdio>
18 #include <memory>
19 #include <mutex>
20 #include "cadaemon_interface.h"
21 #include "cadaemon_stub.h"
22 #include "iremote_stub.h"
23 #include "system_ability.h"
24 #include "tee_auth_common.h"
25 #include "tee_client_api.h"
26 #include "tee_client_inner_api.h"
27 #include "tee_client_type.h"
28 
29 namespace OHOS {
30 namespace CaDaemon {
31 enum class ServiceRunningState {
32     STATE_NOT_START,
33     STATE_RUNNING
34 };
35 
36 using CallerIdentity = struct {
37     int pid;
38     int uid;
39     uint32_t tokenid;
40 };
41 
42 using DaemonProcdata = struct {
43     CallerIdentity callerIdentity;
44     uint32_t opsCnt;
45     int32_t cxtFd[MAX_CXTCNT_ONECA];
46     struct ListNode procdataHead;
47 };
48 
49 using TidData = struct {
50     int callingPid;
51     int tid;
52     struct ListNode tidHead;
53 };
54 
55 using InputPara = struct {
56     uint32_t offset;
57     uint32_t memSize;
58     uint32_t totalSize;
59     uint32_t paraType;
60 };
61 
62 using DecodePara = struct {
63     TEEC_SharedMemory shm[TEEC_PARAM_NUM];
64     TEEC_SharedMemoryInner *shmInner[TEEC_PARAM_NUM];
65     TEEC_ContextInner *contextInner;
66 };
67 
68 class CaDaemonService : public SystemAbility, public CaDaemonStub {
69 DECLARE_SYSTEM_ABILITY(CaDaemonService);
70 public:
CaDaemonService(int32_t systemAbilityId,bool runOnCreate)71     CaDaemonService(int32_t systemAbilityId, bool runOnCreate):SystemAbility(systemAbilityId, runOnCreate) {}
72     ~CaDaemonService() override = default;
73     void OnStart() override;
74     void OnStop() override;
QueryServiceState()75     ServiceRunningState QueryServiceState() const
76     {
77         return state_;
78     }
79     TEEC_Result InitializeContext(const char *name, MessageParcel &reply) override;
80     TEEC_Result FinalizeContext(TEEC_Context *context) override;
81     TEEC_Result OpenSession(TEEC_Context *context, const char *taPath, int32_t &fd,
82         const TEEC_UUID *destination, uint32_t connectionMethod, TEEC_Operation *operation,
83         uint32_t optMemSize, sptr<Ashmem> &optMem, MessageParcel &reply) override;
84     TEEC_Result CloseSession(TEEC_Session *session, TEEC_Context *context) override;
85     TEEC_Result InvokeCommand(TEEC_Context *context, TEEC_Session *session, uint32_t commandID,
86         TEEC_Operation *operation, uint32_t optMemSize, sptr<Ashmem> &optMem, MessageParcel &reply) override;
87     TEEC_Result RegisterSharedMemory(TEEC_Context *context,
88         TEEC_SharedMemory *sharedMem,  MessageParcel &reply) override;
89     TEEC_Result AllocateSharedMemory(TEEC_Context *context,
90         TEEC_SharedMemory *sharedMem, MessageParcel &reply) override;
91     TEEC_Result ReleaseSharedMemory(TEEC_Context *context,
92         TEEC_SharedMemory *sharedMem, uint32_t shmOffset, MessageParcel &reply) override;
93     int32_t SetCallBack(const sptr<IRemoteObject> &notify) override;
94     TEEC_Result SendSecfile(const char *path, int fd, FILE *fp, MessageParcel &reply) override;
95     TEEC_Result GetTeeVersion(MessageParcel &reply) override;
96     void OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId) override;
97 private:
98     bool Init();
99     bool registerToService_ = false;
100     std::mutex mProcDataLock;
101     ServiceRunningState state_ = ServiceRunningState::STATE_NOT_START;
102     TEEC_Result SetContextToProcData(const CallerIdentity &identity, TEEC_ContextInner *outContext);
103     DaemonProcdata *CallGetProcDataPtr(const CallerIdentity &identity);
104     bool IsValidContext(const TEEC_Context *context, const CallerIdentity &identity);
105     bool IsValidContextWithoutLock(const TEEC_Context *context, const CallerIdentity &identity);
106     void PutBnContextAndReleaseFd(int32_t pid, TEEC_ContextInner *outContext);
107     void ReleaseContext(int32_t pid, TEEC_ContextInner **contextInner);
108     TEEC_Result CallFinalizeContext(int32_t pid, const TEEC_Context *contextPtr);
109     TEEC_Result CallGetBnContext(const TEEC_Context *inContext, const CallerIdentity &identity,
110         TEEC_Session **outSession, TEEC_ContextInner **outContext);
111     TEEC_Result CallGetBnSession(const CallerIdentity &identity, const TEEC_Context *inContext,
112     const TEEC_Session *inSession, TEEC_ContextInner **outContext, TEEC_Session **outSession);
113     TEEC_Result TeecOptDecodeTempMem(TEEC_Parameter *param, uint8_t **data, size_t *dataSize);
114     TEEC_Result GetTeecOptMem(TEEC_Operation *operation, size_t optMemSize,
115         sptr<Ashmem> &optMem, DecodePara *paraDecode);
116     TEEC_Result TeecOptDecodePartialMem(DecodePara *paraDecode, uint8_t *data,
117         InputPara *inputPara, TEEC_Operation *operation, uint32_t paramCnt);
118     void PutAllocShrMem(TEEC_SharedMemoryInner *shmInner[], uint32_t shmNum);
119     int32_t AddClient(pid_t pid, const sptr<IRemoteObject> &notify);
120     void CleanProcDataForOneCa(DaemonProcdata *procData);
121     void ProcessCaDied(int32_t pid);
122     void CreateTuiThread();
123     int GetTEEVersion();
124     __attribute__((no_sanitize("cfi"))) void CreateDstbTeeService();
125 
126     class Client : public IRemoteObject::DeathRecipient {
127     public:
Client(pid_t pid,const sptr<IRemoteObject> & notify,const sptr<CaDaemonService> & caDaemonService)128         Client(pid_t pid, const sptr<IRemoteObject> &notify, const sptr<CaDaemonService> &caDaemonService)
129             : mPid(pid), mNotify(notify), mService(caDaemonService)
130         {
131         }
132         virtual ~Client();
133         pid_t GetMyPid() const;
134         virtual void OnRemoteDied(const wptr<IRemoteObject> &deathNotify);
135 
136     private:
137         pid_t mPid;
138         sptr<IRemoteObject> mNotify;
139         sptr<CaDaemonService> mService;
140     };
141     std::mutex mClientLock;
142     std::vector<sptr<Client>> mClients;
143     int mTeeVersion;
144     void *mDstbHandle;
145 };
146 } // namespace CaDaemon
147 } // namespace OHOS
148 
149 #endif
150