• 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 <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 */