• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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);