1e656c62eSopenharmony_ci/*
2e656c62eSopenharmony_ci * Copyright (C) 2022 Huawei Technologies Co., Ltd.
3e656c62eSopenharmony_ci * Licensed under the Mulan PSL v2.
4e656c62eSopenharmony_ci * You can use this software according to the terms and conditions of the Mulan PSL v2.
5e656c62eSopenharmony_ci * You may obtain a copy of Mulan PSL v2 at:
6e656c62eSopenharmony_ci *     http://license.coscl.org.cn/MulanPSL2
7e656c62eSopenharmony_ci * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
8e656c62eSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
9e656c62eSopenharmony_ci * PURPOSE.
10e656c62eSopenharmony_ci * See the Mulan PSL v2 for more details.
11e656c62eSopenharmony_ci */
12e656c62eSopenharmony_ci
13e656c62eSopenharmony_ci#ifndef TEE_CLIENT_H
14e656c62eSopenharmony_ci#define TEE_CLIENT_H
15e656c62eSopenharmony_ci
16e656c62eSopenharmony_ci#include <cstdint>
17e656c62eSopenharmony_ci#include <cstdio>
18e656c62eSopenharmony_ci#include <mutex>
19e656c62eSopenharmony_ci#include "ashmem.h"
20e656c62eSopenharmony_ci#include "ipc_types.h"
21e656c62eSopenharmony_ci#include "iremote_proxy.h"
22e656c62eSopenharmony_ci#include "iremote_stub.h"
23e656c62eSopenharmony_ci#include "tee_client_api.h"
24e656c62eSopenharmony_ci#include "tee_client_inner.h"
25e656c62eSopenharmony_ci#include "tee_log.h"
26e656c62eSopenharmony_ci
27e656c62eSopenharmony_cinamespace OHOS {
28e656c62eSopenharmony_ciconst std::u16string INTERFACE_TOKEN = u"ohos.tee_client.accessToken";
29e656c62eSopenharmony_ciusing TC_NS_ShareMem = struct {
30e656c62eSopenharmony_ci    uint32_t offset;
31e656c62eSopenharmony_ci    void *buffer;
32e656c62eSopenharmony_ci    uint32_t size;
33e656c62eSopenharmony_ci    int32_t fd; /* Used to mark which context sharemem belongs to */
34e656c62eSopenharmony_ci};
35e656c62eSopenharmony_ci
36e656c62eSopenharmony_ci/* keep same with cadaemon interface defines */
37e656c62eSopenharmony_cienum {
38e656c62eSopenharmony_ci    INIT_CONTEXT = 0,
39e656c62eSopenharmony_ci    FINAL_CONTEXT,
40e656c62eSopenharmony_ci    OPEN_SESSION,
41e656c62eSopenharmony_ci    CLOSE_SESSION,
42e656c62eSopenharmony_ci    INVOKE_COMMND,
43e656c62eSopenharmony_ci    REGISTER_MEM,
44e656c62eSopenharmony_ci    ALLOC_MEM,
45e656c62eSopenharmony_ci    RELEASE_MEM,
46e656c62eSopenharmony_ci    SET_CALL_BACK,
47e656c62eSopenharmony_ci    SEND_SECFILE,
48e656c62eSopenharmony_ci    GET_TEE_VERSION
49e656c62eSopenharmony_ci};
50e656c62eSopenharmony_ci
51e656c62eSopenharmony_ciclass TeeClient {
52e656c62eSopenharmony_cipublic:
53e656c62eSopenharmony_ci    static TeeClient &GetInstance()
54e656c62eSopenharmony_ci    {
55e656c62eSopenharmony_ci        static TeeClient instance;
56e656c62eSopenharmony_ci        return instance;
57e656c62eSopenharmony_ci    }
58e656c62eSopenharmony_ci    TEEC_Result InitializeContext(const char *name, TEEC_Context *context);
59e656c62eSopenharmony_ci    void FinalizeContext(TEEC_Context *context);
60e656c62eSopenharmony_ci    TEEC_Result OpenSession(TEEC_Context *context, TEEC_Session *session, const TEEC_UUID *destination,
61e656c62eSopenharmony_ci        uint32_t connectionMethod, const void *connectionData, TEEC_Operation *operation, uint32_t *returnOrigin);
62e656c62eSopenharmony_ci    void CloseSession(TEEC_Session *session);
63e656c62eSopenharmony_ci    TEEC_Result InvokeCommand(TEEC_Session *session, uint32_t commandID,
64e656c62eSopenharmony_ci        TEEC_Operation *operation, uint32_t *returnOrigin);
65e656c62eSopenharmony_ci    TEEC_Result RegisterSharedMemory(TEEC_Context *context, TEEC_SharedMemory *sharedMem);
66e656c62eSopenharmony_ci    TEEC_Result AllocateSharedMemory(TEEC_Context *context, TEEC_SharedMemory *sharedMem);
67e656c62eSopenharmony_ci    void ReleaseSharedMemory(TEEC_SharedMemory *sharedMem);
68e656c62eSopenharmony_ci    void RequestCancellation(const TEEC_Operation *operation);
69e656c62eSopenharmony_ci    TEEC_Result SendSecfile(const char *path, TEEC_Session *session);
70e656c62eSopenharmony_ci    TEEC_Result GetTeeVersion(uint32_t &teeVersion);
71e656c62eSopenharmony_ci
72e656c62eSopenharmony_ci    class DeathNotifier : public IRemoteObject::DeathRecipient {
73e656c62eSopenharmony_ci    public:
74e656c62eSopenharmony_ci        explicit DeathNotifier(const sptr<IRemoteObject> &deathNotify) : serviceBinder(deathNotify)
75e656c62eSopenharmony_ci        {
76e656c62eSopenharmony_ci        }
77e656c62eSopenharmony_ci        virtual ~DeathNotifier()
78e656c62eSopenharmony_ci        {
79e656c62eSopenharmony_ci            if (mServiceValid && (serviceBinder != nullptr)) {
80e656c62eSopenharmony_ci                serviceBinder->RemoveDeathRecipient(this);
81e656c62eSopenharmony_ci            }
82e656c62eSopenharmony_ci        }
83e656c62eSopenharmony_ci        virtual void OnRemoteDied(const wptr<IRemoteObject> &deathNotify)
84e656c62eSopenharmony_ci        {
85e656c62eSopenharmony_ci            (void)deathNotify;
86e656c62eSopenharmony_ci            tloge("teec service died");
87e656c62eSopenharmony_ci            mServiceValid = false;
88e656c62eSopenharmony_ci        }
89e656c62eSopenharmony_ci
90e656c62eSopenharmony_ci    private:
91e656c62eSopenharmony_ci        sptr<IRemoteObject> serviceBinder;
92e656c62eSopenharmony_ci    };
93e656c62eSopenharmony_ci
94e656c62eSopenharmony_ci    friend class DeathNotifier;
95e656c62eSopenharmony_ci
96e656c62eSopenharmony_ciprivate:
97e656c62eSopenharmony_ci    TeeClient() : mTeecService(nullptr), mDeathNotifier(nullptr), mNotify(nullptr)
98e656c62eSopenharmony_ci    {
99e656c62eSopenharmony_ci        tloge("Init TeeClient\n");
100e656c62eSopenharmony_ci    }
101e656c62eSopenharmony_ci
102e656c62eSopenharmony_ci    ~TeeClient()
103e656c62eSopenharmony_ci    {
104e656c62eSopenharmony_ci        FreeAllShareMem();
105e656c62eSopenharmony_ci        tloge("TeeClient Destroy\n");
106e656c62eSopenharmony_ci    }
107e656c62eSopenharmony_ci
108e656c62eSopenharmony_ci    TeeClient(const TeeClient &) = delete;
109e656c62eSopenharmony_ci    TeeClient &operator=(const TeeClient &) = delete;
110e656c62eSopenharmony_ci
111e656c62eSopenharmony_ci    void InitTeecService();
112e656c62eSopenharmony_ci    bool SetCallBack();
113e656c62eSopenharmony_ci    int32_t GetFileFd(const char *filePath);
114e656c62eSopenharmony_ci    TEEC_Result InitializeContextSendCmd(const char *name, MessageParcel &reply);
115e656c62eSopenharmony_ci    TEEC_Result OpenSessionSendCmd(TEEC_Context *context, TEEC_Session *session, const TEEC_UUID *destination,
116e656c62eSopenharmony_ci        uint32_t connectionMethod, int32_t fd, TEEC_Operation *operation, uint32_t *retOrigin);
117e656c62eSopenharmony_ci    bool FormatSession(TEEC_Session *session, MessageParcel &reply);
118e656c62eSopenharmony_ci    TEEC_Result InvokeCommandSendCmd(TEEC_Context *context, TEEC_Session *session, uint32_t commandID,
119e656c62eSopenharmony_ci    TEEC_Operation *operation, uint32_t *returnOrigin);
120e656c62eSopenharmony_ci    TEEC_Result GetOptMemSize(TEEC_Operation *operation, size_t *memSize);
121e656c62eSopenharmony_ci    TEEC_Result GetPartialMemSize(TEEC_Operation *operation, size_t optMemSize,
122e656c62eSopenharmony_ci        uint32_t paramCnt, uint32_t *cSize);
123e656c62eSopenharmony_ci    TEEC_Result CopyTeecOptMem(TEEC_Operation *operation, size_t optMemSize, sptr<Ashmem> &optMem);
124e656c62eSopenharmony_ci    TEEC_Result TeecOptEncode(TEEC_Operation *operation, sptr<Ashmem> &optMem, size_t dataSize);
125e656c62eSopenharmony_ci    TEEC_Result TeecOptEncodeTempMem(const TEEC_Parameter *param, sptr<Ashmem> &optMem, size_t *dataSize);
126e656c62eSopenharmony_ci    TEEC_Result GetTeecOptMem(TEEC_Operation *operation, size_t optMemSize, sptr<Ashmem> &optMem, MessageParcel &reply);
127e656c62eSopenharmony_ci    TEEC_Result TeecOptDecode(TEEC_Operation *operation, TEEC_Operation *inOpt, const uint8_t *data, size_t dataSize);
128e656c62eSopenharmony_ci    TEEC_Result TeecOptDecodeTempMem(TEEC_Parameter *param, uint32_t paramType, const TEEC_Parameter *inParam,
129e656c62eSopenharmony_ci        const uint8_t **data, size_t *dataSize);
130e656c62eSopenharmony_ci    TEEC_Result TeecOptDecodePartialMem(TEEC_Parameter *param, uint32_t paramType,
131e656c62eSopenharmony_ci        TEEC_Parameter *inParam, const uint8_t **data, size_t *dataSize);
132e656c62eSopenharmony_ci    TEEC_Result TeecOptEncodePartialMem(const TEEC_Parameter *param,
133e656c62eSopenharmony_ci        uint32_t paramType, sptr<Ashmem> &optMem, size_t *dataSize);
134e656c62eSopenharmony_ci    bool CovertEncodePtr(sptr<Ashmem> &optMem, size_t *sizeLeft, TEEC_SharedMemory *shm);
135e656c62eSopenharmony_ci    TEEC_Result FormatSharedMemory(MessageParcel &reply, TEEC_SharedMemory *sharedMem, uint32_t *offset);
136e656c62eSopenharmony_ci    TEEC_Result MapSharedMemory(int fd, uint32_t offset, TEEC_SharedMemory *sharedMem);
137e656c62eSopenharmony_ci    TEEC_Result ProcAllocateSharedMemory(MessageParcel &reply, TEEC_SharedMemory *sharedMem);
138e656c62eSopenharmony_ci    uint32_t FindShareMemOffset(const void *buffer);
139e656c62eSopenharmony_ci    void AddShareMem(void *buffer, uint32_t offset, uint32_t size, int32_t fd);
140e656c62eSopenharmony_ci    void FreeAllShareMem();
141e656c62eSopenharmony_ci    void FreeAllShareMemoryInContext(const TEEC_Context *context);
142e656c62eSopenharmony_ci    TEEC_Result FreeShareMem(TEEC_SharedMemory *sharedMem);
143e656c62eSopenharmony_ci    TEEC_Result TEEC_CheckOperation(const TEEC_Operation *operation);
144e656c62eSopenharmony_ci
145e656c62eSopenharmony_ci    std::mutex mServiceLock;
146e656c62eSopenharmony_ci    std::mutex mSharMemLock;
147e656c62eSopenharmony_ci    static bool mServiceValid;
148e656c62eSopenharmony_ci    sptr<IRemoteObject> mTeecService;
149e656c62eSopenharmony_ci    sptr<DeathNotifier> mDeathNotifier;
150e656c62eSopenharmony_ci    sptr<IRemoteObject> mNotify;
151e656c62eSopenharmony_ci    std::vector<TC_NS_ShareMem> mShareMem;
152e656c62eSopenharmony_ci};
153e656c62eSopenharmony_ci} // namespace OHOS
154e656c62eSopenharmony_ci#endif
155