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 DaemonProcdata = struct {
37     int callingPid;
38     uint32_t opsCnt;
39     int32_t cxtFd[MAX_CXTCNT_ONECA];
40     struct ListNode procdataHead;
41 };
42 
43 using TidData = struct {
44     int callingPid;
45     int tid;
46     struct ListNode tidHead;
47 };
48 
49 using InputPara = struct {
50     uint32_t offset;
51     uint32_t memSize;
52     uint32_t totalSize;
53     uint32_t paraType;
54 };
55 
56 using DecodePara = struct {
57     TEEC_SharedMemory shm[TEEC_PARAM_NUM];
58     TEEC_SharedMemoryInner *shmInner[TEEC_PARAM_NUM];
59     TEEC_ContextInner *contextInner;
60 };
61 
62 class CaDaemonService : public SystemAbility, public CaDaemonStub {
63 DECLARE_SYSTEM_ABILITY(CaDaemonService);
64 public:
CaDaemonService(int32_t systemAbilityId,bool runOnCreate)65     CaDaemonService(int32_t systemAbilityId, bool runOnCreate):SystemAbility(systemAbilityId, runOnCreate) {}
66     ~CaDaemonService() override = default;
67     void OnStart() override;
68     void OnStop() override;
QueryServiceState()69     ServiceRunningState QueryServiceState() const
70     {
71         return state_;
72     }
73     TEEC_Result InitializeContext(const char *name, MessageParcel &reply) override;
74     TEEC_Result FinalizeContext(TEEC_Context *context) override;
75     TEEC_Result OpenSession(TEEC_Context *context, const char *taPath, int32_t fd,
76         const TEEC_UUID *destination, uint32_t connectionMethod, TEEC_Operation *operation,
77         uint32_t optMemSize, sptr<Ashmem> &optMem, MessageParcel &reply) override;
78     TEEC_Result CloseSession(TEEC_Session *session, TEEC_Context *context) override;
79     TEEC_Result InvokeCommand(TEEC_Context *context, TEEC_Session *session, uint32_t commandID,
80         TEEC_Operation *operation, uint32_t optMemSize, sptr<Ashmem> &optMem, MessageParcel &reply) override;
81     TEEC_Result RegisterSharedMemory(TEEC_Context *context,
82         TEEC_SharedMemory *sharedMem,  MessageParcel &reply) override;
83     TEEC_Result AllocateSharedMemory(TEEC_Context *context,
84         TEEC_SharedMemory *sharedMem, MessageParcel &reply) override;
85     TEEC_Result ReleaseSharedMemory(TEEC_Context *context,
86         TEEC_SharedMemory *sharedMem, uint32_t shmOffset, MessageParcel &reply) override;
87     int32_t SetCallBack(const sptr<IRemoteObject> &notify) override;
88     TEEC_Result SendSecfile(const char *path, int fd, FILE *fp, MessageParcel &reply) override;
89     TEEC_Result GetTeeVersion(MessageParcel &reply) override;
90 
91 private:
92     bool Init();
93     bool registerToService_ = false;
94     std::mutex mProcDataLock;
95     ServiceRunningState state_ = ServiceRunningState::STATE_NOT_START;
96     TEEC_Result SetContextToProcData(int32_t pid, TEEC_ContextInner *outContext);
97     DaemonProcdata *CallGetProcDataPtr(int pid);
98     bool IsValidContext(const TEEC_Context *context, int pid);
99     bool IsValidContextWithoutLock(const TEEC_Context *context, int pid);
100     void PutBnContextAndReleaseFd(int32_t pid, TEEC_ContextInner *outContext);
101     void ReleaseContext(int32_t pid, TEEC_ContextInner **contextInner);
102     TEEC_Result CallFinalizeContext(int32_t pid, const TEEC_Context *contextPtr);
103     TEEC_Result CallGetBnContext(const TEEC_Context *inContext, int pid,
104         TEEC_Session **outSession, TEEC_ContextInner **outContext);
105     TEEC_Result CallGetBnSession(int pid, const TEEC_Context *inContext,
106     const TEEC_Session *inSession, TEEC_ContextInner **outContext, TEEC_Session **outSession);
107     TEEC_Result TeecOptDecodeTempMem(TEEC_Parameter *param, uint8_t **data, size_t *dataSize);
108     TEEC_Result GetTeecOptMem(TEEC_Operation *operation, size_t optMemSize,
109         sptr<Ashmem> &optMem, DecodePara *paraDecode);
110     TEEC_Result TeecOptDecodePartialMem(DecodePara *paraDecode, uint8_t *data,
111         InputPara *inputPara, TEEC_Operation *operation, uint32_t paramCnt);
112     void PutAllocShrMem(TEEC_SharedMemoryInner *shmInner[], uint32_t shmNum);
113     int32_t AddClient(pid_t pid, const sptr<IRemoteObject> &notify);
114     void CleanProcDataForOneCa(DaemonProcdata *procData);
115     void ProcessCaDied(int32_t pid);
116     void CreateTuiThread();
117     int GetTEEVersion();
118 
119     class Client : public IRemoteObject::DeathRecipient {
120     public:
Client(pid_t pid,const sptr<IRemoteObject> & notify,const sptr<CaDaemonService> & caDaemonService)121         Client(pid_t pid, const sptr<IRemoteObject> &notify, const sptr<CaDaemonService> &caDaemonService)
122             : mPid(pid), mNotify(notify), mService(caDaemonService)
123         {
124         }
125         virtual ~Client();
126         pid_t GetMyPid() const;
127         virtual void OnRemoteDied(const wptr<IRemoteObject> &deathNotify);
128 
129     private:
130         pid_t mPid;
131         sptr<IRemoteObject> mNotify;
132         sptr<CaDaemonService> mService;
133     };
134     std::mutex mClientLock;
135     std::vector<sptr<Client>> mClients;
136     int mTeeVersion;
137 };
138 } // namespace CaDaemon
139 } // namespace OHOS
140 #endif
141