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 }