• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2024 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 "auth_session_message.h"
17 
18 #include <math.h>
19 #include <securec.h>
20 
21 #include "anonymizer.h"
22 #include "auth_attest_interface.h"
23 #include "auth_common.h"
24 #include "auth_connection.h"
25 #include "auth_device_common_key.h"
26 #include "auth_hichain_adapter.h"
27 #include "auth_log.h"
28 #include "auth_manager.h"
29 #include "auth_meta_manager.h"
30 #include "auth_request.h"
31 #include "auth_session_json.h"
32 #include "bus_center_manager.h"
33 #include "lnn_common_utils.h"
34 #include "lnn_compress.h"
35 #include "lnn_event.h"
36 #include "lnn_extdata_config.h"
37 #include "lnn_feature_capability.h"
38 #include "lnn_lane_link.h"
39 #include "lnn_local_net_ledger.h"
40 #include "lnn_network_manager.h"
41 #include "lnn_node_info.h"
42 #include "softbus_adapter_json.h"
43 #include "softbus_adapter_mem.h"
44 #include "softbus_adapter_socket.h"
45 #include "softbus_adapter_timer.h"
46 #include "softbus_config_type.h"
47 #include "softbus_def.h"
48 #include "softbus_error_code.h"
49 #include "softbus_feature_config.h"
50 #include "softbus_json_utils.h"
51 #include "softbus_socket.h"
52 #include "wifi_direct_manager.h"
53 
54 #define FLAG_COMPRESS_DEVICE_INFO   1
55 #define FLAG_UNCOMPRESS_DEVICE_INFO 0
56 #define FLAG_RELAY_DEVICE_INFO      1
57 #define DEVICE_ID_STR_LEN           64 // for bt v1
58 
UnPackBtDeviceIdV1(AuthSessionInfo * info,const uint8_t * data,uint32_t len)59 static int32_t UnPackBtDeviceIdV1(AuthSessionInfo *info, const uint8_t *data, uint32_t len)
60 {
61     if (!info->isServer) {
62         AUTH_LOGE(AUTH_FSM, "is not server");
63         return SOFTBUS_INVALID_PARAM;
64     }
65     if (memcpy_s(info->udid, UDID_BUF_LEN, data, len) != EOK) { // data:StandardCharsets.UTF_8
66         AUTH_LOGE(AUTH_FSM, "memcpy fail");
67         return SOFTBUS_MEM_ERR;
68     }
69     return SOFTBUS_OK;
70 }
71 
PostDeviceIdData(int64_t authSeq,const AuthSessionInfo * info,uint8_t * data,uint32_t len)72 static int32_t PostDeviceIdData(int64_t authSeq, const AuthSessionInfo *info, uint8_t *data, uint32_t len)
73 {
74     AuthDataHead head = {
75         .dataType = DATA_TYPE_DEVICE_ID,
76         .module = MODULE_TRUST_ENGINE,
77         .seq = authSeq,
78         .flag = info->isConnectServer ? SERVER_SIDE_FLAG : CLIENT_SIDE_FLAG,
79         .len = len,
80     };
81     if (PostAuthData(info->connId, !info->isServer, &head, data) != SOFTBUS_OK) {
82         AUTH_LOGE(AUTH_FSM, "post device id fail");
83         return SOFTBUS_AUTH_SEND_FAIL;
84     }
85     return SOFTBUS_OK;
86 }
87 
PostBtV1DevId(int64_t authSeq,const AuthSessionInfo * info)88 static int32_t PostBtV1DevId(int64_t authSeq, const AuthSessionInfo *info)
89 {
90     if (!info->isServer) {
91         AUTH_LOGE(AUTH_FSM, "client don't send Bt-v1 devId");
92         return SOFTBUS_AUTH_NOT_NEED_SEND_V1_DEV_ID;
93     }
94     char uuid[UUID_BUF_LEN] = { 0 };
95     if (LnnGetLocalStrInfo(STRING_KEY_UUID, uuid, UUID_BUF_LEN) != SOFTBUS_OK) {
96         AUTH_LOGE(AUTH_FSM, "get uuid fail");
97         return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
98     }
99     return PostDeviceIdData(authSeq, info, (uint8_t *)uuid, strlen(uuid));
100 }
101 
PostWifiV1DevId(int64_t authSeq,const AuthSessionInfo * info)102 static int32_t PostWifiV1DevId(int64_t authSeq, const AuthSessionInfo *info)
103 {
104     if (!info->isServer) {
105         AUTH_LOGE(AUTH_FSM, "client don't send wifi-v1 devId");
106         return SOFTBUS_AUTH_NOT_NEED_SEND_V1_DEV_ID;
107     }
108     char *msg = PackDeviceIdJson(info);
109     if (msg == NULL) {
110         AUTH_LOGE(AUTH_FSM, "pack devId fail");
111         return SOFTBUS_AUTH_PACK_DEV_ID_FAIL;
112     }
113     if (PostDeviceIdData(authSeq, info, (uint8_t *)msg, strlen(msg) + 1) != SOFTBUS_OK) {
114         JSON_Free(msg);
115         return SOFTBUS_AUTH_SEND_FAIL;
116     }
117     JSON_Free(msg);
118     return SOFTBUS_OK;
119 }
120 
PostDeviceIdV1(int64_t authSeq,const AuthSessionInfo * info)121 static int32_t PostDeviceIdV1(int64_t authSeq, const AuthSessionInfo *info)
122 {
123     if (info->connInfo.type == AUTH_LINK_TYPE_WIFI) {
124         return PostWifiV1DevId(authSeq, info);
125     } else {
126         AUTH_LOGI(AUTH_FSM, "process v1 bt deviceIdSync");
127         return PostBtV1DevId(authSeq, info);
128     }
129 }
130 
PostDeviceIdNew(int64_t authSeq,const AuthSessionInfo * info)131 static int32_t PostDeviceIdNew(int64_t authSeq, const AuthSessionInfo *info)
132 {
133     char *msg = PackDeviceIdJson(info);
134     if (msg == NULL) {
135         AUTH_LOGE(AUTH_FSM, "pack devId fail");
136         return SOFTBUS_AUTH_PACK_DEV_ID_FAIL;
137     }
138     if (PostDeviceIdData(authSeq, info, (uint8_t *)msg, strlen(msg) + 1) != SOFTBUS_OK) {
139         JSON_Free(msg);
140         return SOFTBUS_AUTH_SEND_FAIL;
141     }
142     JSON_Free(msg);
143     return SOFTBUS_OK;
144 }
145 
DfxRecordLnnPostDeviceIdStart(int64_t authSeq,const AuthSessionInfo * info)146 static void DfxRecordLnnPostDeviceIdStart(int64_t authSeq, const AuthSessionInfo *info)
147 {
148     LnnEventExtra extra = { 0 };
149     LnnEventExtraInit(&extra);
150     extra.authId = (int32_t)authSeq;
151     if (info != NULL) {
152         extra.authRequestId = (int32_t)info->requestId;
153     }
154     LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH_DEVICE_ID_POST, extra);
155 }
156 
PostDeviceIdMessage(int64_t authSeq,const AuthSessionInfo * info)157 int32_t PostDeviceIdMessage(int64_t authSeq, const AuthSessionInfo *info)
158 {
159     DfxRecordLnnPostDeviceIdStart(authSeq, info);
160     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
161     if (info->version == SOFTBUS_OLD_V1) {
162         return PostDeviceIdV1(authSeq, info);
163     } else {
164         return PostDeviceIdNew(authSeq, info);
165     }
166 }
167 
ProcessDeviceIdMessage(AuthSessionInfo * info,const uint8_t * data,uint32_t len)168 int32_t ProcessDeviceIdMessage(AuthSessionInfo *info, const uint8_t *data, uint32_t len)
169 {
170     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
171     AUTH_CHECK_AND_RETURN_RET_LOGE(data != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "data is NULL");
172     if ((info->connInfo.type != AUTH_LINK_TYPE_WIFI) && (len == DEVICE_ID_STR_LEN) && (info->isServer)) {
173         info->version = SOFTBUS_OLD_V1;
174         return UnPackBtDeviceIdV1(info, data, len);
175     }
176     return UnpackDeviceIdJson((const char *)data, len, info);
177 }
178 
GetDumpSessionKeyList(int64_t authSeq,const AuthSessionInfo * info,SessionKeyList * list)179 static void GetDumpSessionKeyList(int64_t authSeq, const AuthSessionInfo *info, SessionKeyList *list)
180 {
181     ListInit(list);
182     SessionKey sessionKey;
183     int64_t index = authSeq;
184     if (info->normalizedType == NORMALIZED_SUPPORT) {
185         index = info->normalizedIndex;
186     }
187     if (AuthManagerGetSessionKey(index, info, &sessionKey) != SOFTBUS_OK) {
188         AUTH_LOGE(AUTH_FSM, "get session key fail");
189         return;
190     }
191     if (AddSessionKey(list, TO_INT32(index), &sessionKey, info->connInfo.type, false) != SOFTBUS_OK) {
192         AUTH_LOGE(AUTH_FSM, "add session key fail");
193         (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
194         return;
195     }
196     (void)memset_s(&sessionKey, sizeof(SessionKey), 0, sizeof(SessionKey));
197     if (SetSessionKeyAvailable(list, TO_INT32(index)) != SOFTBUS_OK) {
198         AUTH_LOGE(AUTH_FSM, "set session key available fail");
199     }
200 }
201 
DfxRecordLnnPostDeviceInfoStart(int64_t authSeq,const AuthSessionInfo * info)202 static void DfxRecordLnnPostDeviceInfoStart(int64_t authSeq, const AuthSessionInfo *info)
203 {
204     LnnEventExtra extra = { 0 };
205     LnnEventExtraInit(&extra);
206     extra.authId = (int32_t)authSeq;
207     if (info != NULL) {
208         extra.authRequestId = (int32_t)info->requestId;
209     }
210     LNN_EVENT(EVENT_SCENE_JOIN_LNN, EVENT_STAGE_AUTH_DEVICE_INFO_POST, extra);
211 }
212 
SetCompressFlagByAuthInfo(const AuthSessionInfo * info,char * msg,int32_t * compressFlag,uint8_t ** compressData,uint32_t * compressLen)213 static void SetCompressFlagByAuthInfo(
214     const AuthSessionInfo *info, char *msg, int32_t *compressFlag, uint8_t **compressData, uint32_t *compressLen)
215 {
216     if ((info->connInfo.type != AUTH_LINK_TYPE_WIFI) && info->isSupportCompress) {
217         AUTH_LOGI(AUTH_FSM, "before compress, datalen=%{public}zu", strlen(msg) + 1);
218         if (DataCompress((uint8_t *)msg, strlen(msg) + 1, compressData, compressLen) != SOFTBUS_OK) {
219             *compressFlag = FLAG_UNCOMPRESS_DEVICE_INFO;
220         } else {
221             *compressFlag = FLAG_COMPRESS_DEVICE_INFO;
222             AUTH_LOGI(AUTH_FSM, "deviceInfo compress finish");
223         }
224         AUTH_LOGI(AUTH_FSM, "after compress, datalen=%{public}u", *compressLen);
225     }
226 }
227 
SetIndataInfo(InDataInfo * inDataInfo,uint8_t * compressData,uint32_t compressLen,char * msg)228 static void SetIndataInfo(InDataInfo *inDataInfo, uint8_t *compressData, uint32_t compressLen, char *msg)
229 {
230     if ((compressData != NULL) && (compressLen != 0)) {
231         inDataInfo->inData = compressData;
232         inDataInfo->inLen = compressLen;
233     } else {
234         inDataInfo->inData = (uint8_t *)msg;
235         inDataInfo->inLen = strlen(msg) + 1;
236     }
237 }
238 
PostAuthTestInfoMessage(int64_t authSeq,const AuthSessionInfo * info)239 int32_t PostAuthTestInfoMessage(int64_t authSeq, const AuthSessionInfo *info)
240 {
241     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
242     char *msg = PackAuthTestInfoMessage(&(info->connInfo));
243     if (msg == NULL) {
244         AUTH_LOGE(AUTH_FSM, "pack test auth info fail");
245         return SOFTBUS_AUTH_PACK_DEVINFO_FAIL;
246     }
247     InDataInfo inDataInfo = { 0 };
248     uint8_t *data = NULL;
249     uint32_t dataLen = 0;
250     SetIndataInfo(&inDataInfo, NULL, 0, msg);
251     SessionKeyList sessionKeyList;
252     GetDumpSessionKeyList(authSeq, info, &sessionKeyList);
253     if (EncryptInner(&sessionKeyList, info->connInfo.type, &inDataInfo, &data, &dataLen) != SOFTBUS_OK) {
254         AUTH_LOGE(AUTH_FSM, "encrypt device info fail");
255         JSON_Free(msg);
256         return SOFTBUS_ENCRYPT_ERR;
257     }
258     JSON_Free(msg);
259     DestroySessionKeyList(&sessionKeyList);
260     AuthDataHead head = {
261         .dataType = DATA_TYPE_TEST_AUTH,
262         .module = MODULE_AUTH_TEST,
263         .seq = authSeq,
264         .flag = 0,
265         .len = dataLen,
266     };
267     if (PostAuthData(info->connId, !info->isServer, &head, data) != SOFTBUS_OK) {
268         AUTH_LOGE(AUTH_FSM, "post device info fail");
269         SoftBusFree(data);
270         return SOFTBUS_AUTH_SEND_FAIL;
271     }
272     SoftBusFree(data);
273     return SOFTBUS_OK;
274 }
275 
PostDeviceInfoMessage(int64_t authSeq,const AuthSessionInfo * info)276 int32_t PostDeviceInfoMessage(int64_t authSeq, const AuthSessionInfo *info)
277 {
278     DfxRecordLnnPostDeviceInfoStart(authSeq, info);
279     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
280     char *msg = PackDeviceInfoMessage(&(info->connInfo), info->version, false, info->uuid, info);
281     if (msg == NULL) {
282         AUTH_LOGE(AUTH_FSM, "pack device info fail");
283         return SOFTBUS_AUTH_PACK_DEVINFO_FAIL;
284     }
285     int32_t compressFlag = FLAG_UNCOMPRESS_DEVICE_INFO;
286     uint8_t *compressData = NULL;
287     uint32_t compressLen = 0;
288     SetCompressFlagByAuthInfo(info, msg, &compressFlag, &compressData, &compressLen);
289     InDataInfo inDataInfo = { 0 };
290     uint8_t *data = NULL;
291     uint32_t dataLen = 0;
292     SetIndataInfo(&inDataInfo, compressData, compressLen, msg);
293     SessionKeyList sessionKeyList;
294     GetDumpSessionKeyList(authSeq, info, &sessionKeyList);
295     if (EncryptInner(&sessionKeyList, info->connInfo.type, &inDataInfo, &data, &dataLen) != SOFTBUS_OK) {
296         AUTH_LOGE(AUTH_FSM, "encrypt device info fail");
297         JSON_Free(msg);
298         SoftBusFree(compressData);
299         return SOFTBUS_ENCRYPT_ERR;
300     }
301     JSON_Free(msg);
302     SoftBusFree(compressData);
303     DestroySessionKeyList(&sessionKeyList);
304     if (info->connInfo.type == AUTH_LINK_TYPE_WIFI && info->isServer) {
305         compressFlag = FLAG_RELAY_DEVICE_INFO;
306         authSeq = 0;
307     }
308     AuthDataHead head = {
309         .dataType = DATA_TYPE_DEVICE_INFO,
310         .module = MODULE_AUTH_CONNECTION,
311         .seq = authSeq,
312         .flag = compressFlag,
313         .len = dataLen,
314     };
315     if (PostAuthData(info->connId, !info->isServer, &head, data) != SOFTBUS_OK) {
316         AUTH_LOGE(AUTH_FSM, "post device info fail");
317         SoftBusFree(data);
318         return SOFTBUS_AUTH_SEND_FAIL;
319     }
320     SoftBusFree(data);
321     return SOFTBUS_OK;
322 }
323 
TryUpdateLaneResourceLaneId(AuthSessionInfo * info)324 int32_t TryUpdateLaneResourceLaneId(AuthSessionInfo *info)
325 {
326     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
327     int32_t ret;
328     char localUDID[UDID_BUF_LEN] = { 0 };
329     ret = LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, localUDID, UDID_BUF_LEN);
330     AUTH_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, AUTH_FSM, "get local udid fail");
331     uint64_t oldLaneId = GenerateLaneId(localUDID, info->connInfo.info.ipInfo.ip, LANE_HML_RAW);
332     uint64_t newLaneId = GenerateLaneId(localUDID, info->nodeInfo.deviceInfo.deviceUdid, LANE_HML_RAW);
333     ret = UpdateLaneResourceLaneId(oldLaneId, newLaneId, info->nodeInfo.deviceInfo.deviceUdid);
334     AUTH_CHECK_AND_RETURN_RET_LOGE(ret == SOFTBUS_OK, ret, AUTH_FSM, "update lane resource laneid fail");
335     return SOFTBUS_OK;
336 }
337 
ProcessDeviceInfoMessage(int64_t authSeq,AuthSessionInfo * info,const uint8_t * data,uint32_t len)338 int32_t ProcessDeviceInfoMessage(int64_t authSeq, AuthSessionInfo *info, const uint8_t *data, uint32_t len)
339 {
340     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
341     AUTH_CHECK_AND_RETURN_RET_LOGE(data != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "data is NULL");
342     uint8_t *msg = NULL;
343     uint32_t msgSize = 0;
344     SessionKeyList sessionKeyList;
345     GetDumpSessionKeyList(authSeq, info, &sessionKeyList);
346     InDataInfo inDataInfo = { .inData = data, .inLen = len };
347     if (DecryptInner(&sessionKeyList, info->connInfo.type, &inDataInfo, &msg, &msgSize) != SOFTBUS_OK) {
348         AUTH_LOGE(AUTH_FSM, "decrypt device info fail");
349         return SOFTBUS_DECRYPT_ERR;
350     }
351     DestroySessionKeyList(&sessionKeyList);
352     uint8_t *decompressData = NULL;
353     uint32_t decompressLen = 0;
354     if ((info->connInfo.type != AUTH_LINK_TYPE_WIFI) && info->isSupportCompress) {
355         AUTH_LOGI(AUTH_FSM, "before decompress, msgSize=%{public}u", msgSize);
356         if (DataDecompress((uint8_t *)msg, msgSize, &decompressData, &decompressLen) != SOFTBUS_OK) {
357             AUTH_LOGE(AUTH_FSM, "data decompress fail");
358             SoftBusFree(msg);
359             return SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL;
360         } else {
361             AUTH_LOGI(AUTH_FSM, "deviceInfo deCompress finish, decompress=%{public}d", decompressLen);
362         }
363         AUTH_LOGI(AUTH_FSM, "after decompress, datalen=%{public}d", decompressLen);
364     }
365     DevInfoData devInfo = { NULL, 0, info->connInfo.type, info->version };
366     if ((decompressData != NULL) && (decompressLen != 0)) {
367         devInfo.msg = (const char *)decompressData;
368         devInfo.len = decompressLen;
369     } else {
370         devInfo.msg = (const char *)msg;
371         devInfo.len = msgSize;
372     }
373     if (UnpackDeviceInfoMessage(&devInfo, &info->nodeInfo, false, info) != SOFTBUS_OK) {
374         AUTH_LOGE(AUTH_FSM, "unpack device info fail");
375         SoftBusFree(msg);
376         SoftBusFree(decompressData);
377         return SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL;
378     }
379     GetWifiDirectManager()->refreshRelationShip(info->uuid, info->nodeInfo.wifiDirectAddr);
380     if (TryUpdateLaneResourceLaneId(info) != SOFTBUS_OK) {
381         AUTH_LOGE(AUTH_FSM, "update lane resource laneid fail");
382     }
383     SoftBusFree(msg);
384     SoftBusFree(decompressData);
385     return SOFTBUS_OK;
386 }
387 
PostCloseAckMessage(int64_t authSeq,const AuthSessionInfo * info)388 int32_t PostCloseAckMessage(int64_t authSeq, const AuthSessionInfo *info)
389 {
390     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
391     const char *msg = "";
392     AuthDataHead head = {
393         .dataType = DATA_TYPE_CLOSE_ACK,
394         .module = 0,
395         .seq = authSeq,
396         .flag = 0,
397         .len = strlen(msg) + 1,
398     };
399     if (PostAuthData(info->connId, !info->isServer, &head, (uint8_t *)msg) != SOFTBUS_OK) {
400         AUTH_LOGE(AUTH_FSM, "post close ack fail");
401         return SOFTBUS_AUTH_SEND_FAIL;
402     }
403     return SOFTBUS_OK;
404 }
405 
PostHichainAuthMessage(int64_t authSeq,const AuthSessionInfo * info,const uint8_t * data,uint32_t len)406 int32_t PostHichainAuthMessage(int64_t authSeq, const AuthSessionInfo *info, const uint8_t *data, uint32_t len)
407 {
408     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
409     AUTH_CHECK_AND_RETURN_RET_LOGE(data != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "data is NULL");
410     AuthDataHead head = {
411         .dataType = DATA_TYPE_AUTH,
412         .module = MODULE_AUTH_SDK,
413         .seq = authSeq,
414         .flag = 0,
415         .len = len,
416     };
417     if (PostAuthData(info->connId, !info->isServer, &head, data) != SOFTBUS_OK) {
418         AUTH_LOGE(AUTH_FSM, "post hichain data fail");
419         return SOFTBUS_AUTH_SEND_FAIL;
420     }
421     return SOFTBUS_OK;
422 }
423 
PackVerifyDeviceMessage(const char * uuid)424 static char *PackVerifyDeviceMessage(const char *uuid)
425 {
426     JsonObj *obj = JSON_CreateObject();
427     if (obj == NULL) {
428         AUTH_LOGE(AUTH_FSM, "create json fail");
429         return NULL;
430     }
431     if (!JSON_AddInt32ToObject(obj, CODE, CODE_VERIFY_DEVICE) || !JSON_AddStringToObject(obj, DEVICE_ID, uuid)) {
432         AUTH_LOGE(AUTH_FSM, "add uuid fail");
433         JSON_Delete(obj);
434         return NULL;
435     }
436     char *msg = JSON_PrintUnformatted(obj);
437     JSON_Delete(obj);
438     return msg;
439 }
440 
PackKeepaliveMessage(const char * uuid,ModeCycle cycle)441 static char *PackKeepaliveMessage(const char *uuid, ModeCycle cycle)
442 {
443     JsonObj *obj = JSON_CreateObject();
444     if (obj == NULL) {
445         AUTH_LOGE(AUTH_FSM, "create json fail");
446         return NULL;
447     }
448     if (!JSON_AddInt32ToObject(obj, CODE, CODE_TCP_KEEPALIVE) || !JSON_AddStringToObject(obj, DEVICE_ID, uuid) ||
449         !JSON_AddInt32ToObject(obj, TIME, cycle)) {
450         AUTH_LOGE(AUTH_FSM, "add uuid or cycle fail");
451         JSON_Delete(obj);
452         return NULL;
453     }
454     char *msg = JSON_PrintUnformatted(obj);
455     JSON_Delete(obj);
456     return msg;
457 }
458 
IsDeviceMessagePacket(const AuthConnInfo * connInfo,const AuthDataHead * head,const uint8_t * data,bool isServer,DeviceMessageParse * messageParse)459 bool IsDeviceMessagePacket(const AuthConnInfo *connInfo, const AuthDataHead *head, const uint8_t *data, bool isServer,
460     DeviceMessageParse *messageParse)
461 {
462     if (connInfo->type != AUTH_LINK_TYPE_WIFI) {
463         return false;
464     }
465     int64_t authId = AuthDeviceGetIdByConnInfo(connInfo, isServer);
466     if (authId == AUTH_INVALID_ID) {
467         AUTH_LOGE(AUTH_FSM, "is flush device packet not find authId");
468         return false;
469     }
470     uint32_t decDataLen = AuthGetDecryptSize(head->len);
471     uint8_t *decData = (uint8_t *)SoftBusCalloc(decDataLen);
472     if (decData == NULL) {
473         return false;
474     }
475     AuthHandle authHandle = { .authId = authId, .type = connInfo->type };
476     if (AuthDeviceDecrypt(&authHandle, data, head->len, decData, &decDataLen) != SOFTBUS_OK) {
477         SoftBusFree(decData);
478         AUTH_LOGE(AUTH_FSM, "parse device info decrypt fail");
479         return false;
480     }
481     JsonObj *json = JSON_Parse((char *)decData, decDataLen);
482     if (json == NULL) {
483         AUTH_LOGE(AUTH_FSM, "parse json fail");
484         SoftBusFree(decData);
485         return false;
486     }
487     bool result = false;
488     if (!JSON_GetInt32FromOject(json, CODE, &messageParse->messageType)) {
489         AUTH_LOGE(AUTH_FSM, "parse messageType fail");
490     }
491     AUTH_LOGI(AUTH_FSM, "messageType=%{public}d", messageParse->messageType);
492     if (messageParse->messageType == CODE_VERIFY_DEVICE) {
493         result = true;
494     }
495     if (messageParse->messageType == CODE_TCP_KEEPALIVE) {
496         if (JSON_GetInt32FromOject(json, TIME, (int32_t *)&messageParse->cycle)) {
497             AUTH_LOGI(AUTH_FSM, "parse keepalive cycle success, cycle=%{public}d", messageParse->cycle);
498             result = true;
499         }
500     }
501     JSON_Delete(json);
502     SoftBusFree(decData);
503     return result;
504 }
505 
IsEmptyShortHashStr(char * udidHash)506 static bool IsEmptyShortHashStr(char *udidHash)
507 {
508     if (strlen(udidHash) == 0) {
509         AUTH_LOGE(AUTH_FSM, "udidHash len is 0");
510         return true;
511     }
512     uint8_t emptyHash[SHORT_HASH_LEN] = { 0 };
513     char emptyHashStr[UDID_SHORT_HASH_HEX_STR + 1] = { 0 };
514     if (ConvertBytesToHexString(emptyHashStr, UDID_SHORT_HASH_HEX_STR + 1, emptyHash, SHORT_HASH_LEN) != SOFTBUS_OK) {
515         AUTH_LOGE(AUTH_FSM, "convert bytes to string fail");
516         return false;
517     }
518     if (strncmp(emptyHashStr, udidHash, strlen(emptyHashStr)) == EOK) {
519         AUTH_LOGE(AUTH_FSM, "udidHash is null");
520         return true;
521     }
522     return false;
523 }
524 
GetLocalUdidHash(char * udid,char * udidHash,uint32_t len)525 static int32_t GetLocalUdidHash(char *udid, char *udidHash, uint32_t len)
526 {
527     if (udid == NULL || udidHash == NULL || len < UDID_HASH_LEN) {
528         AUTH_LOGE(AUTH_FSM, "invalid param");
529         return SOFTBUS_INVALID_PARAM;
530     }
531     uint8_t hash[UDID_HASH_LEN] = { 0 };
532     if (SoftBusGenerateStrHash((unsigned char *)udid, strlen(udid), (unsigned char *)hash) != SOFTBUS_OK) {
533         AUTH_LOGE(AUTH_FSM, "restore manager fail because generate strhash");
534         return SOFTBUS_NETWORK_GENERATE_STR_HASH_ERR;
535     }
536     if (ConvertBytesToHexString(udidHash, len, hash, UDID_SHORT_HASH_LEN_TEMP) != SOFTBUS_OK) {
537         AUTH_LOGE(AUTH_FSM, "convert bytes to string fail");
538         return SOFTBUS_NETWORK_BYTES_TO_HEX_STR_ERR;
539     }
540     return SOFTBUS_OK;
541 }
542 
UpdateLocalAuthState(int64_t authSeq,AuthSessionInfo * info)543 int32_t UpdateLocalAuthState(int64_t authSeq, AuthSessionInfo *info)
544 {
545     CHECK_NULL_PTR_RETURN_VALUE(info, SOFTBUS_INVALID_PARAM);
546     if (info->isServer && strlen(info->udid) == 0) {
547         info->localState = AUTH_STATE_UNKNOW;
548         AUTH_LOGI(AUTH_FSM, "authSeq=%{public}" PRId64 ", udid is null update local auth state=%{public}d", authSeq,
549             info->localState);
550         return SOFTBUS_OK;
551     }
552     if (info->peerState == AUTH_STATE_COMPATIBLE) {
553         info->localState = AUTH_STATE_COMPATIBLE;
554         AUTH_LOGI(AUTH_FSM, "authSeq=%{public}" PRId64 " local auth state=%{public}d", authSeq, info->localState);
555         return SOFTBUS_OK;
556     }
557     if (info->peerState == AUTH_STATE_ACK || info->peerState == AUTH_STATE_START) {
558         info->localState = AUTH_STATE_ACK;
559         AUTH_LOGI(AUTH_FSM, "authSeq=%{public}" PRId64 " local auth state=%{public}d", authSeq, info->localState);
560         return SOFTBUS_OK;
561     }
562     char udid[UDID_BUF_LEN] = { 0 };
563     if (LnnGetLocalStrInfo(STRING_KEY_DEV_UDID, udid, UDID_BUF_LEN) != SOFTBUS_OK) {
564         AUTH_LOGE(AUTH_FSM, "get local udid fail");
565         return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
566     }
567     char localUdidHash[SHA_256_HEX_HASH_LEN] = { 0 };
568     char udidHash[SHA_256_HEX_HASH_LEN] = { 0 };
569     if (GetLocalUdidHash(udid, localUdidHash, SHA_256_HEX_HASH_LEN) != SOFTBUS_OK) {
570         AUTH_LOGE(AUTH_FSM, "get local udid hash fail");
571         return SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR;
572     }
573     if (!GetUdidShortHash(info, udidHash, SHA_256_HEX_HASH_LEN) || IsEmptyShortHashStr(udidHash)) {
574         AUTH_LOGI(AUTH_FSM, "unknow peer udidHash");
575         info->localState = AUTH_STATE_UNKNOW;
576     } else if (memcmp(localUdidHash, udidHash, SHORT_HASH_LEN) < 0) {
577         info->localState = AUTH_STATE_WAIT;
578     } else if (memcmp(localUdidHash, udidHash, SHORT_HASH_LEN) > 0) {
579         info->localState = AUTH_STATE_START;
580     } else {
581         AUTH_LOGE(AUTH_FSM, "peer udidHash = local udidHash!");
582         info->localState = AUTH_STATE_START;
583     }
584     if (strlen(udidHash) != 0 && strcpy_s(info->udidHash, SHA_256_HEX_HASH_LEN, udidHash) != EOK) {
585         AUTH_LOGE(AUTH_FSM, "memcpy udidHash fail");
586         return SOFTBUS_MEM_ERR;
587     }
588     AUTH_LOGI(AUTH_FSM, "authSeq=%{public}" PRId64 " local auth state=%{public}d", authSeq, info->localState);
589     return SOFTBUS_OK;
590 }
591 
PostDeviceMessage(const AuthManager * auth,int32_t flagRelay,AuthLinkType type,const DeviceMessageParse * messageParse)592 int32_t PostDeviceMessage(
593     const AuthManager *auth, int32_t flagRelay, AuthLinkType type, const DeviceMessageParse *messageParse)
594 {
595     AUTH_CHECK_AND_RETURN_RET_LOGE(auth != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "auth is NULL");
596     if (messageParse == NULL) {
597         AUTH_LOGE(AUTH_FSM, "invalid param");
598         return SOFTBUS_INVALID_PARAM;
599     }
600     if (type < AUTH_LINK_TYPE_WIFI || type >= AUTH_LINK_TYPE_MAX) {
601         AUTH_LOGE(AUTH_FSM, "type error, type=%{public}d", type);
602         return SOFTBUS_AUTH_CONN_TYPE_INVALID;
603     }
604     char *msg = NULL;
605     if (messageParse->messageType == CODE_VERIFY_DEVICE) {
606         msg = PackVerifyDeviceMessage(auth->uuid);
607     } else if (messageParse->messageType == CODE_TCP_KEEPALIVE) {
608         msg = PackKeepaliveMessage(auth->uuid, messageParse->cycle);
609     }
610     if (msg == NULL) {
611         AUTH_LOGE(AUTH_FSM, "pack verify device msg fail");
612         return SOFTBUS_AUTH_PACK_VERIFY_MSG_FAIL;
613     }
614 
615     uint8_t *data = NULL;
616     uint32_t dataLen = 0;
617     InDataInfo inDataInfo = { .inData = (uint8_t *)msg, .inLen = strlen(msg) + 1 };
618     if (EncryptInner(&auth->sessionKeyList, type, &inDataInfo, &data, &dataLen) != SOFTBUS_OK) {
619         AUTH_LOGE(AUTH_FSM, "encrypt device info fail");
620         JSON_Free(msg);
621         return SOFTBUS_ENCRYPT_ERR;
622     }
623     JSON_Free(msg);
624 
625     AuthDataHead head = {
626         .dataType = DATA_TYPE_DEVICE_INFO,
627         .module = MODULE_AUTH_CONNECTION,
628         .seq = auth->authId,
629         .flag = flagRelay,
630         .len = dataLen,
631     };
632     if (PostAuthData(auth->connId[type], !auth->isServer, &head, data) != SOFTBUS_OK) {
633         AUTH_LOGE(AUTH_FSM, "post verify device msg fail");
634         SoftBusFree(data);
635         return SOFTBUS_AUTH_SEND_FAIL;
636     }
637     SoftBusFree(data);
638     return SOFTBUS_OK;
639 }
640 
ProcessAuthTestDataMessage(int64_t authSeq,AuthSessionInfo * info,const uint8_t * data,uint32_t len)641 int32_t ProcessAuthTestDataMessage(int64_t authSeq, AuthSessionInfo *info, const uint8_t *data, uint32_t len)
642 {
643     AUTH_CHECK_AND_RETURN_RET_LOGE(info != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "info is NULL");
644     AUTH_CHECK_AND_RETURN_RET_LOGE(data != NULL, SOFTBUS_INVALID_PARAM, AUTH_FSM, "data is NULL");
645     uint8_t *msg = NULL;
646     uint32_t msgSize = 0;
647     SessionKeyList sessionKeyList;
648     GetDumpSessionKeyList(authSeq, info, &sessionKeyList);
649     InDataInfo inDataInfo = { .inData = data, .inLen = len };
650     if (DecryptInner(&sessionKeyList, info->connInfo.type, &inDataInfo, &msg, &msgSize) != SOFTBUS_OK) {
651         AUTH_LOGE(AUTH_FSM, "decrypt device info fail");
652         return SOFTBUS_DECRYPT_ERR;
653     }
654     DestroySessionKeyList(&sessionKeyList);
655     return UnpackAuthTestDataJson((const char *)msg, msgSize);
656 }