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