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#include "tee_agent.h" 14e656c62eSopenharmony_ci#include <errno.h> 15e656c62eSopenharmony_ci#include <fcntl.h> 16e656c62eSopenharmony_ci#include <pthread.h> 17e656c62eSopenharmony_ci#include <signal.h> 18e656c62eSopenharmony_ci#include <sys/ioctl.h> 19e656c62eSopenharmony_ci#include <sys/time.h> 20e656c62eSopenharmony_ci#include <sys/types.h> 21e656c62eSopenharmony_ci#include <time.h> 22e656c62eSopenharmony_ci#include <unistd.h> 23e656c62eSopenharmony_ci#include "tee_ca_daemon.h" 24e656c62eSopenharmony_ci#include "fs_work_agent.h" 25e656c62eSopenharmony_ci#include "late_init_agent.h" 26e656c62eSopenharmony_ci#include "misc_work_agent.h" 27e656c62eSopenharmony_ci#include "secfile_load_agent.h" 28e656c62eSopenharmony_ci#include "tc_ns_client.h" 29e656c62eSopenharmony_ci#include "tee_load_dynamic_drv.h" 30e656c62eSopenharmony_ci#include "tee_log.h" 31e656c62eSopenharmony_ci#include "tcu_authentication.h" 32e656c62eSopenharmony_ci 33e656c62eSopenharmony_ci#ifdef LOG_TAG 34e656c62eSopenharmony_ci#undef LOG_TAG 35e656c62eSopenharmony_ci#endif 36e656c62eSopenharmony_ci#define LOG_TAG "teecd" 37e656c62eSopenharmony_ci 38e656c62eSopenharmony_ci/* smc dev */ 39e656c62eSopenharmony_cistatic int g_fsFd = -1; 40e656c62eSopenharmony_cistatic int g_miscFd = -1; 41e656c62eSopenharmony_ci 42e656c62eSopenharmony_ciint GetMiscFd(void) 43e656c62eSopenharmony_ci{ 44e656c62eSopenharmony_ci return g_miscFd; 45e656c62eSopenharmony_ci} 46e656c62eSopenharmony_ci 47e656c62eSopenharmony_ciint GetFsFd(void) 48e656c62eSopenharmony_ci{ 49e656c62eSopenharmony_ci return g_fsFd; 50e656c62eSopenharmony_ci} 51e656c62eSopenharmony_ci 52e656c62eSopenharmony_cistatic int AgentInit(unsigned int id, void **control) 53e656c62eSopenharmony_ci{ 54e656c62eSopenharmony_ci int ret; 55e656c62eSopenharmony_ci struct AgentIoctlArgs args = { 0 }; 56e656c62eSopenharmony_ci 57e656c62eSopenharmony_ci if (control == NULL) { 58e656c62eSopenharmony_ci return -1; 59e656c62eSopenharmony_ci } 60e656c62eSopenharmony_ci int fd = open(TC_PRIVATE_DEV_NAME, O_RDWR); 61e656c62eSopenharmony_ci if (fd < 0) { 62e656c62eSopenharmony_ci tloge("open tee client dev failed, fd is %d\n", fd); 63e656c62eSopenharmony_ci return -1; 64e656c62eSopenharmony_ci } 65e656c62eSopenharmony_ci 66e656c62eSopenharmony_ci /* register agent */ 67e656c62eSopenharmony_ci args.id = id; 68e656c62eSopenharmony_ci args.bufferSize = TRANS_BUFF_SIZE; 69e656c62eSopenharmony_ci ret = ioctl(fd, (int)TC_NS_CLIENT_IOCTL_REGISTER_AGENT, &args); 70e656c62eSopenharmony_ci if (ret) { 71e656c62eSopenharmony_ci (void)close(fd); 72e656c62eSopenharmony_ci tloge("ioctl failed\n"); 73e656c62eSopenharmony_ci return -1; 74e656c62eSopenharmony_ci } 75e656c62eSopenharmony_ci 76e656c62eSopenharmony_ci *control = args.buffer; 77e656c62eSopenharmony_ci return fd; 78e656c62eSopenharmony_ci} 79e656c62eSopenharmony_ci 80e656c62eSopenharmony_cistatic void AgentExit(unsigned int id, int fd) 81e656c62eSopenharmony_ci{ 82e656c62eSopenharmony_ci int ret; 83e656c62eSopenharmony_ci 84e656c62eSopenharmony_ci if (fd == -1) { 85e656c62eSopenharmony_ci return; 86e656c62eSopenharmony_ci } 87e656c62eSopenharmony_ci 88e656c62eSopenharmony_ci ret = ioctl(fd, (int)TC_NS_CLIENT_IOCTL_UNREGISTER_AGENT, id); 89e656c62eSopenharmony_ci if (ret) { 90e656c62eSopenharmony_ci tloge("ioctl failed\n"); 91e656c62eSopenharmony_ci } 92e656c62eSopenharmony_ci 93e656c62eSopenharmony_ci (void)close(fd); 94e656c62eSopenharmony_ci} 95e656c62eSopenharmony_ci 96e656c62eSopenharmony_cistatic struct SecStorageType *g_fsControl = NULL; 97e656c62eSopenharmony_cistatic struct MiscControlType *g_miscControl = NULL; 98e656c62eSopenharmony_cistatic struct SecAgentControlType *g_secLoadAgentControl = NULL; 99e656c62eSopenharmony_ci 100e656c62eSopenharmony_cistatic int g_fsThreadFlag = 0; 101e656c62eSopenharmony_ci 102e656c62eSopenharmony_cistatic int ProcessAgentInit(void) 103e656c62eSopenharmony_ci{ 104e656c62eSopenharmony_ci int ret; 105e656c62eSopenharmony_ci g_fsFd = AgentInit(AGENT_FS_ID, (void **)(&g_fsControl)); 106e656c62eSopenharmony_ci if (g_fsFd < 0) { 107e656c62eSopenharmony_ci tloge("fs agent init failed\n"); 108e656c62eSopenharmony_ci g_fsThreadFlag = 0; 109e656c62eSopenharmony_ci } else { 110e656c62eSopenharmony_ci g_fsThreadFlag = 1; 111e656c62eSopenharmony_ci } 112e656c62eSopenharmony_ci 113e656c62eSopenharmony_ci g_miscFd = AgentInit(AGENT_MISC_ID, (void **)(&g_miscControl)); 114e656c62eSopenharmony_ci if (g_miscFd < 0) { 115e656c62eSopenharmony_ci tloge("misc agent init failed\n"); 116e656c62eSopenharmony_ci goto ERROR1; 117e656c62eSopenharmony_ci } 118e656c62eSopenharmony_ci 119e656c62eSopenharmony_ci ret = AgentInit(SECFILE_LOAD_AGENT_ID, (void **)(&g_secLoadAgentControl)); 120e656c62eSopenharmony_ci if (ret < 0) { 121e656c62eSopenharmony_ci tloge("secfile load agent init failed\n"); 122e656c62eSopenharmony_ci goto ERROR2; 123e656c62eSopenharmony_ci } 124e656c62eSopenharmony_ci 125e656c62eSopenharmony_ci SetSecLoadAgentFd(ret); 126e656c62eSopenharmony_ci 127e656c62eSopenharmony_ci return 0; 128e656c62eSopenharmony_ciERROR2: 129e656c62eSopenharmony_ci AgentExit(AGENT_MISC_ID, g_miscFd); 130e656c62eSopenharmony_ci g_miscFd = -1; 131e656c62eSopenharmony_ci g_miscControl = NULL; 132e656c62eSopenharmony_ci 133e656c62eSopenharmony_ciERROR1: 134e656c62eSopenharmony_ci if (g_fsThreadFlag == 1) { 135e656c62eSopenharmony_ci AgentExit(AGENT_FS_ID, g_fsFd); 136e656c62eSopenharmony_ci g_fsFd = -1; 137e656c62eSopenharmony_ci g_fsControl = NULL; 138e656c62eSopenharmony_ci g_fsThreadFlag = 0; 139e656c62eSopenharmony_ci } 140e656c62eSopenharmony_ci return -1; 141e656c62eSopenharmony_ci} 142e656c62eSopenharmony_ci 143e656c62eSopenharmony_cistatic void ProcessAgentExit(void) 144e656c62eSopenharmony_ci{ 145e656c62eSopenharmony_ci if (g_fsThreadFlag == 1) { 146e656c62eSopenharmony_ci AgentExit(AGENT_FS_ID, g_fsFd); 147e656c62eSopenharmony_ci g_fsFd = -1; 148e656c62eSopenharmony_ci g_fsControl = NULL; 149e656c62eSopenharmony_ci } 150e656c62eSopenharmony_ci 151e656c62eSopenharmony_ci AgentExit(AGENT_MISC_ID, g_miscFd); 152e656c62eSopenharmony_ci g_miscFd = -1; 153e656c62eSopenharmony_ci g_miscControl = NULL; 154e656c62eSopenharmony_ci 155e656c62eSopenharmony_ci AgentExit(SECFILE_LOAD_AGENT_ID, GetSecLoadAgentFd()); 156e656c62eSopenharmony_ci SetSecLoadAgentFd(-1); 157e656c62eSopenharmony_ci g_secLoadAgentControl = NULL; 158e656c62eSopenharmony_ci} 159e656c62eSopenharmony_ci 160e656c62eSopenharmony_cistatic int SyncSysTimeToSecure(void) 161e656c62eSopenharmony_ci{ 162e656c62eSopenharmony_ci TC_NS_Time tcNsTime; 163e656c62eSopenharmony_ci struct timeval timeVal; 164e656c62eSopenharmony_ci 165e656c62eSopenharmony_ci int ret = gettimeofday(&timeVal, NULL); 166e656c62eSopenharmony_ci if (ret != 0) { 167e656c62eSopenharmony_ci tloge("get system time failed ret=0x%x\n", ret); 168e656c62eSopenharmony_ci return ret; 169e656c62eSopenharmony_ci } 170e656c62eSopenharmony_ci if (timeVal.tv_sec < 0xFFFFF) { 171e656c62eSopenharmony_ci return -1; 172e656c62eSopenharmony_ci } 173e656c62eSopenharmony_ci tcNsTime.seconds = (uint32_t)timeVal.tv_sec; 174e656c62eSopenharmony_ci tcNsTime.millis = (uint32_t)timeVal.tv_usec / 1000; 175e656c62eSopenharmony_ci 176e656c62eSopenharmony_ci int fd = open(TC_PRIVATE_DEV_NAME, O_RDWR); 177e656c62eSopenharmony_ci if (fd < 0) { 178e656c62eSopenharmony_ci tloge("Failed to open %s: %d\n", TC_PRIVATE_DEV_NAME, errno); 179e656c62eSopenharmony_ci return fd; 180e656c62eSopenharmony_ci } 181e656c62eSopenharmony_ci ret = ioctl(fd, (int)TC_NS_CLIENT_IOCTL_SYC_SYS_TIME, &tcNsTime); 182e656c62eSopenharmony_ci if (ret != 0) { 183e656c62eSopenharmony_ci tloge("failed to send sys time to teeos\n"); 184e656c62eSopenharmony_ci } 185e656c62eSopenharmony_ci 186e656c62eSopenharmony_ci close(fd); 187e656c62eSopenharmony_ci return ret; 188e656c62eSopenharmony_ci} 189e656c62eSopenharmony_ci 190e656c62eSopenharmony_civoid TrySyncSysTimeToSecure(void) 191e656c62eSopenharmony_ci{ 192e656c62eSopenharmony_ci static int syncSysTimed = 0; 193e656c62eSopenharmony_ci 194e656c62eSopenharmony_ci if (syncSysTimed == 0) { 195e656c62eSopenharmony_ci int ret = SyncSysTimeToSecure(); 196e656c62eSopenharmony_ci if (ret != 0) { 197e656c62eSopenharmony_ci tloge("failed to sync sys time to secure\n"); 198e656c62eSopenharmony_ci } else { 199e656c62eSopenharmony_ci syncSysTimed = 1; 200e656c62eSopenharmony_ci } 201e656c62eSopenharmony_ci } 202e656c62eSopenharmony_ci} 203e656c62eSopenharmony_ci 204e656c62eSopenharmony_ciint main(void) 205e656c62eSopenharmony_ci{ 206e656c62eSopenharmony_ci pthread_t fsThread = (pthread_t)-1; 207e656c62eSopenharmony_ci pthread_t miscThread = (pthread_t)-1; 208e656c62eSopenharmony_ci pthread_t caDaemonThread = (pthread_t)-1; 209e656c62eSopenharmony_ci pthread_t lateInitThread = (pthread_t)-1; 210e656c62eSopenharmony_ci pthread_t secfileLoadAgentThread = (pthread_t)-1; 211e656c62eSopenharmony_ci 212e656c62eSopenharmony_ci /* Trans the xml file to tzdriver: */ 213e656c62eSopenharmony_ci (void)TcuAuthentication(HASH_TYPE_VENDOR); 214e656c62eSopenharmony_ci 215e656c62eSopenharmony_ci int ret = ProcessAgentInit(); 216e656c62eSopenharmony_ci if (ret) { 217e656c62eSopenharmony_ci return ret; 218e656c62eSopenharmony_ci } 219e656c62eSopenharmony_ci 220e656c62eSopenharmony_ci TrySyncSysTimeToSecure(); 221e656c62eSopenharmony_ci 222e656c62eSopenharmony_ci LoadDynamicDir(); 223e656c62eSopenharmony_ci 224e656c62eSopenharmony_ci (void)pthread_create(&caDaemonThread, NULL, CaServerWorkThread, NULL); 225e656c62eSopenharmony_ci 226e656c62eSopenharmony_ci SetFileNumLimit(); 227e656c62eSopenharmony_ci 228e656c62eSopenharmony_ci if (g_fsThreadFlag == 1) { 229e656c62eSopenharmony_ci (void)pthread_create(&fsThread, NULL, FsWorkThread, g_fsControl); 230e656c62eSopenharmony_ci } 231e656c62eSopenharmony_ci 232e656c62eSopenharmony_ci (void)pthread_create(&miscThread, NULL, MiscWorkThread, g_miscControl); 233e656c62eSopenharmony_ci 234e656c62eSopenharmony_ci (void)pthread_create(&lateInitThread, NULL, InitLateWorkThread, NULL); 235e656c62eSopenharmony_ci (void)pthread_create(&secfileLoadAgentThread, NULL, SecfileLoadAgentThread, g_secLoadAgentControl); 236e656c62eSopenharmony_ci 237e656c62eSopenharmony_ci if (g_fsThreadFlag == 1) { 238e656c62eSopenharmony_ci (void)pthread_join(fsThread, NULL); 239e656c62eSopenharmony_ci } 240e656c62eSopenharmony_ci (void)pthread_join(miscThread, NULL); 241e656c62eSopenharmony_ci (void)pthread_join(caDaemonThread, NULL); 242e656c62eSopenharmony_ci 243e656c62eSopenharmony_ci (void)pthread_join(lateInitThread, NULL); 244e656c62eSopenharmony_ci (void)pthread_join(secfileLoadAgentThread, NULL); 245e656c62eSopenharmony_ci 246e656c62eSopenharmony_ci ProcessAgentExit(); 247e656c62eSopenharmony_ci return 0; 248e656c62eSopenharmony_ci} 249