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