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 <stdbool.h>
17 #include <stdio.h>
18 #include <stdarg.h>
19 #include <stdlib.h>
20 #include <securec.h>
21 #include "cJSON.h"
22 #include "attest_utils.h"
23 #include "attest_utils_file.h"
24 #include "attest_mock.h"
25
26 #ifdef __LITEOS_M__
27 #include "utils_file.h"
28 #endif
29
30 #ifdef __cplusplus
31 #if __cplusplus
32 extern "C" {
33 #endif
34 #endif /* __cplusplus */
35
InitMockData(AttestMockData * attestMockData)36 int32_t InitMockData(AttestMockData *attestMockData)
37 {
38 // devicePara 数据
39 cJSON *root = cJSON_CreateObject();
40 cJSON_AddStringToObject(root, ATTEST_MOCK_DEVICE_PARA_VERSION_ID, attestMockData->deviceMockData.mockVersionId);
41 cJSON_AddStringToObject(root, ATTEST_MOCK_DEVICE_PARA_VERSION_HASH, attestMockData->deviceMockData.mockVersionHash);
42 cJSON_AddStringToObject(root, ATTEST_MOCK_DEVICE_PARA_DISPLAY_VERSION,
43 attestMockData->deviceMockData.mockDisplayVersion);
44 cJSON_AddStringToObject(root, ATTEST_MOCK_DEVICE_PARA_MANU_STR, attestMockData->deviceMockData.mockManuStr);
45 cJSON_AddStringToObject(root, ATTEST_MOCK_DEVICE_PARA_DEVICE_MODEL, attestMockData->deviceMockData.mockDeviceModel);
46 cJSON_AddStringToObject(root, ATTEST_MOCK_DEVICE_PARA_BRAND, attestMockData->deviceMockData.mockBrand);
47 cJSON_AddStringToObject(root, ATTEST_MOCK_DEVICE_PARA_PATCH_TAG, attestMockData->deviceMockData.mockPatchTag);
48 cJSON_AddStringToObject(root, ATTEST_MOCK_DEVICE_PARA_SERIAL, attestMockData->deviceMockData.mockSerial);
49
50 const char *devicePara = cJSON_PrintUnformatted(root);
51 cJSON_Delete(root);
52
53 // network_mock 数据
54 AttestNetworkMockData NetworkMockData = attestMockData->NetworkMockData;
55 int32_t ret = WriteNetWorkMock(&NetworkMockData);
56 if (ret != ATTEST_OK) {
57 return ATTEST_ERR;
58 }
59
60 // 写文件
61 ret = WriteFile(ATTEST_MOCK_STUB_PATH, ATTEST_MOCK_TOKEN_FILE_NAME, ATTEST_MOCK_TOKEN, strlen(ATTEST_MOCK_TOKEN));
62 if (ret != ATTEST_OK) {
63 return ATTEST_ERR;
64 }
65 ret = WriteFile(ATTEST_MOCK_STUB_PATH, ATTEST_MOCK_STUB_DEVICE_NAME, devicePara, strlen(devicePara));
66 if (ret != ATTEST_OK) {
67 return ATTEST_ERR;
68 }
69 ATTEST_MEM_FREE(devicePara);
70 return ret;
71 }
72
BuildMockNetworkParaChallenge(cJSON ** networkParaChallenge,long long currentTime,char * challenge,int errCode)73 static int32_t BuildMockNetworkParaChallenge(cJSON ** networkParaChallenge,
74 long long currentTime, char* challenge, int errCode)
75 {
76 if (networkParaChallenge == NULL || challenge == NULL) {
77 return ATTEST_ERR;
78 }
79 cJSON *authStatusChallenge = cJSON_CreateObject();
80 cJSON_AddNumberToObject(authStatusChallenge, ATTEST_MOCK_NETWORK_PARA_CURRENTTIME, currentTime);
81 cJSON_AddStringToObject(authStatusChallenge, ATTEST_MOCK_NETWORK_PARA_CHALLENGE, challenge);
82 cJSON_AddNumberToObject(authStatusChallenge, ATTEST_MOCK_NETWORK_PARA_ERRCODE, errCode);
83 NetworkMockData->authStatusChange.errCode);
84 cJSON_AddItemToObject(&networkParaChallenge, ATTEST_MOCK_NETWORK_PARA_CHALLENGE, authStatusChallenge);
85 return ATTEST_OK;
86 }
87
88
WriteAuthChangeMock(AttestNetworkMockData * NetworkMockData,cJSON ** netWorkMockJson)89 static int32_t WriteAuthChangeMock(AttestNetworkMockData *NetworkMockData, cJSON ** netWorkMockJson)
90 {
91 if (netWorkMockJson == NULL) {
92 return ATTEST_ERR;
93 }
94
95 cJSON *authStatusChange = cJSON_CreateObject();
96 int32_t ret = BuildMockNetworkParaChallenge(&authStatusChange,
97 NetworkMockData->authStatusChange.currentTime,
98 NetworkMockData->authStatusChange.challenge,
99 NetworkMockData->authStatusChange.errCode);
100 if (ret != ATTEST_OK) {
101 cJSON_Delete(authStatusChange);
102 return ATTEST_ERR;
103 }
104
105 cJSON_AddItemToObject(&netWorkMockJson, ATTEST_MOCK_NETWORK_AUTHCHANGE, authStatusChange);
106 }
107
WriteResetMock(AttestNetworkMockData * NetworkMockData,cJSON ** netWorkMockJson)108 static int32_t WriteResetMock(AttestNetworkMockData *NetworkMockData, cJSON ** netWorkMockJson)
109 {
110 if (netWorkMockJson == NULL) {
111 return ATTEST_ERR;
112 }
113
114 cJSON *resetDevice = cJSON_CreateObject();
115 cJSON *resetResponse = cJSON_CreateObject();
116 ret = BuildMockNetworkParaChallenge(&resetDevice,
117 NetworkMockData->resetNetMockData.currentTime,
118 NetworkMockData->resetNetMockData.challenge,
119 NetworkMockData->resetNetMockData.errCode);
120 if (ret != ATTEST_OK) {
121 cJSON_Delete(resetDevice);
122 cJSON_Delete(resetResponse);
123 return ATTEST_ERR;
124 }
125 cJSON_AddNumberToObject(resetResponse, ATTEST_MOCK_NETWORK_PARA_ERRCODE,
126 NetworkMockData->resetNetMockData.responseErrCode);
127 cJSON_AddItemToObject(resetDevice, ATTEST_MOCK_NETWORK_RESPONSE, resetResponse);
128
129 cJSON_AddItemToObject(netWorkMockJson, ATTEST_MOCK_NETWORK_RESET, resetDevice);
130 }
131
WriteAuthMock(AttestNetworkMockData * NetworkMockData,cJSON ** netWorkMockJson)132 static int32_t WriteAuthMock(AttestNetworkMockData *NetworkMockData, cJSON ** netWorkMockJson)
133 {
134 if (netWorkMockJson == NULL) {
135 return ATTEST_ERR;
136 }
137
138 cJSON *authDevice = cJSON_CreateObject();
139 cJSON *authResponse = cJSON_CreateObject();
140 int32_t ret = BuildMockNetworkParaChallenge(&authDevice,
141 NetworkMockData->authDevice.currentTime,
142 NetworkMockData->authDevice.challenge,
143 NetworkMockData->authDevice.errCode);
144 if (ret != ATTEST_OK) {
145 cJSON_Delete(authDevice);
146 cJSON_Delete(authResponse);
147 return ATTEST_ERR;
148 }
149 cJSON_AddStringToObject(authResponse, ATTEST_MOCK_NETWORK_PARA_TICKET, NetworkMockData->authDevice.ticket);
150 cJSON_AddStringToObject(authResponse, ATTEST_MOCK_NETWORK_PARA_UUID, NetworkMockData->authDevice.uuid);
151 cJSON_AddStringToObject(authResponse, ATTEST_MOCK_NETWORK_PARA_AUTHSTATS, NetworkMockData->authDevice.authStats);
152 cJSON_AddStringToObject(authResponse, ATTEST_MOCK_NETWORK_PARA_TOKEN, NetworkMockData->authDevice.token);
153 cJSON_AddNumberToObject(authResponse, ATTEST_MOCK_NETWORK_PARA_ERRCODE,
154 NetworkMockData->authDevice.responseErrCode);
155 cJSON_AddItemToObject(authDevice, ATTEST_MOCK_NETWORK_RESPONSE, authResponse);
156
157 cJSON_AddItemToObject(netWorkMockJson, ATTEST_MOCK_NETWORK_AUTH, authDevice);
158 }
159
WriteActiveMock(AttestNetworkMockData * NetworkMockData,cJSON ** netWorkMockJson)160 static int32_t WriteActiveMock(AttestNetworkMockData *NetworkMockData, cJSON ** netWorkMockJson)
161 {
162 if (netWorkMockJson == NULL) {
163 return ATTEST_ERR;
164 }
165
166 cJSON *activeToken = cJSON_CreateObject();
167 cJSON *activeResponse = cJSON_CreateObject();
168 int32_t ret = BuildMockNetworkParaChallenge(&activeToken,
169 NetworkMockData->activeToken.currentTime,
170 NetworkMockData->activeToken.challenge,
171 NetworkMockData->activeToken.errCode);
172 if (ret != ATTEST_OK) {
173 cJSON_Delete(activeToken);
174 cJSON_Delete(activeResponse);
175 return ATTEST_ERR;
176 }
177 cJSON_AddNumberToObject(activeResponse, ATTEST_MOCK_NETWORK_PARA_ERRCODE,
178 NetworkMockData->activeToken.responseErrCode);
179 cJSON_AddItemToObject(activeToken, ATTEST_MOCK_NETWORK_RESPONSE, activeResponse);
180
181 cJSON_AddItemToObject(netWorkMockJson, ATTEST_MOCK_NETWORK_ACTIVE, activeToken);
182 }
183
WriteNetWorkMock(AttestNetworkMockData * NetworkMockData)184 int32_t WriteNetWorkMock(AttestNetworkMockData *NetworkMockData)
185 {
186 cJSON *netWorkMockJson = cJSON_CreateObject();
187 int32_t ret = WriteAuthChangeMock(NetworkMockData, &netWorkMockJson);
188 if (ret != ATTEST_OK) {
189 cJSON_Delete(netWorkMockJson);
190 return ATTEST_ERR;
191 }
192
193 ret = WriteResetMock(NetworkMockData, &netWorkMockJson);
194 if (ret != ATTEST_OK) {
195 cJSON_Delete(netWorkMockJson);
196 return ATTEST_ERR;
197 }
198
199 ret = WriteAuthMock(NetworkMockData, &netWorkMockJson);
200 if (ret != ATTEST_OK) {
201 cJSON_Delete(netWorkMockJson);
202 return ATTEST_ERR;
203 }
204
205 ret = WriteActiveMock(NetworkMockData, &netWorkMockJson);
206 if (ret != ATTEST_OK) {
207 cJSON_Delete(netWorkMockJson);
208 return ATTEST_ERR;
209 }
210
211 const char *networkPara = cJSON_PrintUnformatted(netWorkMockJson);
212 cJSON_Delete(netWorkMockJson);
213 int32_t ret = WriteFile(ATTEST_MOCK_STUB_PATH, ATTEST_MOCK_STUB_NETWORK_NAME,
214 networkPara, strlen(networkPara));
215 if (ret != ATTEST_OK) {
216 return ATTEST_ERR;
217 }
218
219 ATTEST_MEM_FREE(networkPara);
220 return ret;
221 }
222
223 #ifdef __cplusplus
224 #if __cplusplus
225 }
226 #endif
227 #endif /* __cplusplus */