1 /*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <stdio.h>
17 #include <stdbool.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <securec.h>
21 #include <ohos_init.h>
22 #include <iunknown.h>
23 #include <samgr_lite.h>
24 #include <iproxy_client.h>
25 #include <iproxy_server.h>
26 #include "devattest_errno.h"
27 #include "devattest_log.h"
28 #include "attest_framework_define.h"
29 #include "attest_entry.h"
30
31 typedef struct {
32 INHERIT_SERVER_IPROXY;
33 } AttestFrameworkApi;
34
35 typedef struct {
36 INHERIT_FEATURE;
37 INHERIT_IUNKNOWNENTRY(AttestFrameworkApi);
38 Identity identity;
39 Service *parent;
40 } AttestFrameworkFeature;
41
42 static const char *FEATURE_GetName(Feature *feature);
43 static void FEATURE_OnInitialize(Feature *feature, Service *parent, Identity identity);
44 static void FEATURE_OnStop(Feature *feature, Identity identity);
45 static BOOL FEATURE_OnMessage(Feature *feature, Request *request);
46 static int32_t Invoke(IServerProxy *iProxy, int funcId, void *origin, IpcIo *req, IpcIo *reply);
47
48 // 创建功能对象
49 static AttestFrameworkFeature g_attestFeature = {
50 .GetName = FEATURE_GetName,
51 .OnInitialize = FEATURE_OnInitialize,
52 .OnStop = FEATURE_OnStop,
53 .OnMessage = FEATURE_OnMessage,
54 SERVER_IPROXY_IMPL_BEGIN,
55 .Invoke = Invoke,
56 IPROXY_END,
57 .identity = {-1, -1, NULL},
58 };
59
60 // 实现功能的生命周期函数
FEATURE_GetName(Feature * feature)61 static const char *FEATURE_GetName(Feature *feature)
62 {
63 (void)feature;
64 return ATTEST_FEATURE;
65 }
66
FEATURE_OnInitialize(Feature * feature,Service * parent,Identity identity)67 static void FEATURE_OnInitialize(Feature *feature, Service *parent, Identity identity)
68 {
69 AttestFrameworkFeature *demoFeature = (AttestFrameworkFeature *)feature;
70 demoFeature->identity = identity;
71 demoFeature->parent = parent;
72 }
73
FEATURE_OnStop(Feature * feature,Identity identity)74 static void FEATURE_OnStop(Feature *feature, Identity identity)
75 {
76 (void)feature;
77 (void)identity;
78 g_attestFeature.identity.queueId = NULL;
79 g_attestFeature.identity.featureId = -1;
80 g_attestFeature.identity.serviceId = -1;
81 }
82
FEATURE_OnMessage(Feature * feature,Request * request)83 static BOOL FEATURE_OnMessage(Feature *feature, Request *request)
84 {
85 (void)feature;
86 HILOGI("[FEATURE_OnMessage] request->msgId:%d", request->msgId);
87 return FALSE;
88 }
89
WriteAttestResultInfo(IpcIo * reply,AttestResultInfo * attestResultInfo)90 static int32_t WriteAttestResultInfo(IpcIo *reply, AttestResultInfo *attestResultInfo)
91 {
92 if (reply == NULL) {
93 HILOGE("[WriteAttestResultInfo] reply is null!");
94 return DEVATTEST_FAIL;
95 }
96
97 if (!WriteInt32(reply, DEVATTEST_SUCCESS)) {
98 HILOGE("[WriteAttestResultInfo] Write ret fail!");
99 return DEVATTEST_FAIL;
100 }
101
102 if (!WriteInt32(reply, attestResultInfo->authResult) ||
103 !WriteInt32(reply, attestResultInfo->softwareResult)) {
104 HILOGE("[WriteAttestResultInfo] Write data fail!");
105 return DEVATTEST_FAIL;
106 }
107
108 size_t size = sizeof(attestResultInfo->softwareResultDetail) / sizeof(int32_t);
109 if (!WriteInt32Vector(reply, attestResultInfo->softwareResultDetail, size)) {
110 HILOGE("[WriteAttestResultInfo] Write softwareResultDetail_ fail!");
111 return DEVATTEST_FAIL;
112 }
113
114 if (!WriteInt32(reply, attestResultInfo->ticketLength) ||
115 !WriteString(reply, attestResultInfo->ticket)) {
116 HILOGE("[WriteAttestResultInfo] Write ticket fail!");
117 return DEVATTEST_FAIL;
118 }
119 return DEVATTEST_SUCCESS;
120 }
121
FeatureQueryAttest(IpcIo * reply)122 static int32_t FeatureQueryAttest(IpcIo *reply)
123 {
124 if (reply == NULL) {
125 HILOGE("[FeatureQueryAttest] reply is null!");
126 return DEVATTEST_FAIL;
127 }
128 AttestResultInfo attestResultInfo = { .softwareResultDetail = {-2, -2, -2, -2, -2} };
129 attestResultInfo.authResult = DEVATTEST_RESULT_INIT;
130 attestResultInfo.softwareResult = DEVATTEST_RESULT_INIT;
131 attestResultInfo.ticket = NULL;
132 int32_t ret = EntryGetAttestStatus(&attestResultInfo);
133 if (ret != DEVATTEST_SUCCESS) {
134 HILOGE("[FeatureQueryAttest] Query status fail!");
135 if (!WriteInt32(reply, ret)) {
136 HILOGE("[FeatureQueryAttest] Write ret fail!");
137 }
138 return DEVATTEST_FAIL;
139 }
140
141 ret = WriteAttestResultInfo(reply, &attestResultInfo);
142 if (attestResultInfo.ticketLength != 0) {
143 free(attestResultInfo.ticket);
144 attestResultInfo.ticket = NULL;
145 }
146 return ret;
147 }
148
Invoke(IServerProxy * iProxy,int funcId,void * origin,IpcIo * req,IpcIo * reply)149 static int32_t Invoke(IServerProxy *iProxy, int funcId, void *origin, IpcIo *req, IpcIo *reply)
150 {
151 (void)origin;
152 (void)req;
153 if (iProxy == NULL) {
154 return DEVATTEST_FAIL;
155 }
156 int32_t ret = DEVATTEST_SUCCESS;
157 switch (funcId) {
158 case ATTEST_FRAMEWORK_MSG_PROC:
159 AttestTask();
160 break;
161 case ATTEST_FRAMEWORK_MSG_QUERY:
162 FeatureQueryAttest(reply);
163 break;
164 default:
165 break;
166 }
167 return ret;
168 }
169
170 // 向SAMGR注册功能及接口
Init(void)171 static void Init(void)
172 {
173 SAMGR_GetInstance()->RegisterFeature(ATTEST_SERVICE, (Feature *)&g_attestFeature);
174 SAMGR_GetInstance()->RegisterFeatureApi(ATTEST_SERVICE, ATTEST_FEATURE, GET_IUNKNOWN(g_attestFeature));
175 }
176
177 // 定义功能的初始化入口
178 SYS_FEATURE_INIT(Init);