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 "auth_tcp_connection.h"
17
18 #include <securec.h>
19
20 #include "auth_channel.h"
21 #include "auth_common.h"
22 #include "bus_center_manager.h"
23 #include "softbus_adapter_mem.h"
24 #include "softbus_adapter_socket.h"
25 #include "softbus_base_listener.h"
26 #include "softbus_def.h"
27 #include "softbus_socket.h"
28
29 #define MAGIC_NUMBER 0xBABEFACE
30 #define AUTH_PKT_HEAD_LEN 24
31 #define AUTH_KEEP_ALIVE_TIME_INTERVAL (10 * 60)
32 #define AUTH_SOCKET_MAX_DATA_LEN (64 * 1024)
33
34 typedef struct {
35 int32_t magic;
36 int32_t module;
37 int64_t seq;
38 int32_t flag;
39 uint32_t len;
40 } SocketPktHead;
41
42 typedef struct {
43 int32_t module;
44 AuthChannelListener listener;
45 } InnerChannelListener;
46
47 static InnerChannelListener g_listener[] = {
48 {
49 .module = MODULE_AUTH_CHANNEL,
50 .listener = { NULL, NULL },
51 },
52 {
53 .module = MODULE_AUTH_MSG,
54 .listener = { NULL, NULL },
55 },
56 };
57
58 static SocketCallback g_callback = {NULL, NULL, NULL};
59
60 static void NotifyChannelDisconnected(int32_t channelId);
61 static void NotifyChannelDataReceived(int32_t channelId, const SocketPktHead *head, const uint8_t *data);
RouteBuildServerAuthManager(int32_t cfd,const ConnectOption * clientAddr)62 int32_t __attribute__((weak)) RouteBuildServerAuthManager(int32_t cfd, const ConnectOption *clientAddr)
63 {
64 (void)cfd;
65 (void)clientAddr;
66 return SOFTBUS_OK;
67 }
68
GetSocketPktSize(uint32_t len)69 static uint32_t GetSocketPktSize(uint32_t len)
70 {
71 return AUTH_PKT_HEAD_LEN + len;
72 }
73
PackSocketPkt(const SocketPktHead * pktHead,const uint8_t * data,uint8_t * buf,uint32_t size)74 static int32_t PackSocketPkt(const SocketPktHead *pktHead, const uint8_t *data,
75 uint8_t *buf, uint32_t size)
76 {
77 if (size < GetSocketPktSize(pktHead->len)) {
78 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "SocketPkt: buffer not enough.");
79 return SOFTBUS_NO_ENOUGH_DATA;
80 }
81 uint32_t offset = 0;
82 *(uint32_t *)buf = SoftBusHtoLl((uint32_t)pktHead->magic);
83 offset += sizeof(uint32_t);
84 *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)pktHead->module);
85 offset += sizeof(uint32_t);
86 *(uint64_t *)(buf + offset) = SoftBusHtoLll((uint64_t)pktHead->seq);
87 offset += sizeof(uint64_t);
88 *(uint32_t *)(buf + offset) = SoftBusHtoLl((uint32_t)pktHead->flag);
89 offset += sizeof(uint32_t);
90 *(uint32_t *)(buf + offset) = SoftBusHtoLl(pktHead->len);
91 offset += sizeof(uint32_t);
92 if (memcpy_s(buf + offset, size - offset, data, pktHead->len) != EOK) {
93 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "SocketPkt: pack fail.");
94 return SOFTBUS_MEM_ERR;
95 }
96 return SOFTBUS_OK;
97 }
98
UnpackSocketPkt(const uint8_t * data,uint32_t len,SocketPktHead * head)99 static int32_t UnpackSocketPkt(const uint8_t *data, uint32_t len, SocketPktHead *head)
100 {
101 if (len < GetSocketPktSize(0)) {
102 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "SocketPkt: head not enough.");
103 return SOFTBUS_NO_ENOUGH_DATA;
104 }
105 uint32_t offset = 0;
106 head->magic = (int32_t)SoftBusLtoHl(*(uint32_t *)data);
107 offset += sizeof(uint32_t);
108 head->module = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
109 offset += sizeof(uint32_t);
110 head->seq = (int64_t)SoftBusLtoHll(*(uint64_t *)(data + offset));
111 offset += sizeof(uint64_t);
112 head->flag = (int32_t)SoftBusLtoHl(*(uint32_t *)(data + offset));
113 offset += sizeof(uint32_t);
114 head->len = SoftBusLtoHl(*(uint32_t *)(data + offset));
115 return SOFTBUS_OK;
116 }
117
NotifyConnected(ListenerModule module,int32_t fd,bool isClient)118 NO_SANITIZE("cfi") static void NotifyConnected(ListenerModule module, int32_t fd, bool isClient)
119 {
120 if (g_callback.onConnected != NULL) {
121 g_callback.onConnected(module, fd, isClient);
122 }
123 }
124
NotifyDisconnected(int32_t fd)125 NO_SANITIZE("cfi") static void NotifyDisconnected(int32_t fd)
126 {
127 if (g_callback.onDisconnected != NULL) {
128 g_callback.onDisconnected(fd);
129 }
130 NotifyChannelDisconnected(fd);
131 }
132
ModuleToDataType(int32_t module)133 static uint32_t ModuleToDataType(int32_t module)
134 {
135 switch (module) {
136 case MODULE_TRUST_ENGINE:
137 return DATA_TYPE_DEVICE_ID;
138 case MODULE_AUTH_SDK:
139 return DATA_TYPE_AUTH;
140 case MODULE_AUTH_CONNECTION:
141 return DATA_TYPE_DEVICE_INFO;
142 default:
143 break;
144 }
145 return DATA_TYPE_CONNECTION;
146 }
147
NotifyDataReceived(ListenerModule module,int32_t fd,const SocketPktHead * pktHead,const uint8_t * data)148 NO_SANITIZE("cfi") static void NotifyDataReceived(ListenerModule module, int32_t fd,
149 const SocketPktHead *pktHead, const uint8_t *data)
150 {
151 if (pktHead->module == MODULE_AUTH_CHANNEL || pktHead->module == MODULE_AUTH_MSG) {
152 NotifyChannelDataReceived(fd, pktHead, data);
153 return;
154 }
155 AuthDataHead head = {
156 .dataType = ModuleToDataType(pktHead->module),
157 .module = pktHead->module,
158 .seq = pktHead->seq,
159 .flag = pktHead->flag,
160 .len = pktHead->len,
161 };
162 if (g_callback.onDataReceived != NULL) {
163 g_callback.onDataReceived(module, fd, &head, data);
164 }
165 }
166
RecvPacketHead(ListenerModule module,int32_t fd,SocketPktHead * head)167 static int32_t RecvPacketHead(ListenerModule module, int32_t fd, SocketPktHead *head)
168 {
169 uint8_t buf[AUTH_PKT_HEAD_LEN] = {0};
170 ssize_t len = ConnRecvSocketData(fd, (char *)&buf[0], sizeof(buf), 0);
171 if (len < AUTH_PKT_HEAD_LEN) {
172 if (len < 0) {
173 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "recv head fail(=%d).", ConnGetSocketError(fd));
174 (void)DelTrigger(module, fd, READ_TRIGGER);
175 NotifyDisconnected(fd);
176 }
177 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "head not enough, len=%d, abandon it.", len);
178 return SOFTBUS_ERR;
179 }
180 return UnpackSocketPkt(buf, len, head);
181 }
182
RecvPacketData(int32_t fd,uint32_t len)183 static uint8_t *RecvPacketData(int32_t fd, uint32_t len)
184 {
185 uint8_t *data = (uint8_t *)SoftBusMalloc(len);
186 if (data == NULL) {
187 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc data buf fail.");
188 return NULL;
189 }
190 uint32_t offset = 0;
191 while (offset < len) {
192 ssize_t recvLen = ConnRecvSocketData(fd, (char *)(data + offset), (size_t)(len - offset), 0);
193 if (recvLen < 0) {
194 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "recv data fail(=%d).", ConnGetSocketError(fd));
195 SoftBusFree(data);
196 return NULL;
197 }
198 offset += (uint32_t)recvLen;
199 }
200 return data;
201 }
202
ProcessSocketOutEvent(ListenerModule module,int32_t fd)203 static int32_t ProcessSocketOutEvent(ListenerModule module, int32_t fd)
204 {
205 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "socket client connect succ: fd=%d.", fd);
206 (void)DelTrigger(module, fd, WRITE_TRIGGER);
207 if (AddTrigger(module, fd, READ_TRIGGER) != SOFTBUS_OK) {
208 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AddTrigger fail.");
209 goto FAIL;
210 }
211 if (ConnToggleNonBlockMode(fd, true) != SOFTBUS_OK) {
212 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "set none block mode fail.");
213 goto FAIL;
214 }
215 NotifyConnected(module, fd, true);
216 return SOFTBUS_OK;
217
218 FAIL:
219 (void)DelTrigger(module, fd, READ_TRIGGER);
220 ConnShutdownSocket(fd);
221 NotifyDisconnected(fd);
222 return SOFTBUS_ERR;
223 }
224
ProcessSocketInEvent(ListenerModule module,int32_t fd)225 static int32_t ProcessSocketInEvent(ListenerModule module, int32_t fd)
226 {
227 SocketPktHead head = {0};
228 if (RecvPacketHead(module, fd, &head) != SOFTBUS_OK) {
229 return SOFTBUS_ERR;
230 }
231 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
232 "RecvSocketData: fd=%d, module=%d, seq=%" PRId64 ", flag=%d, len=%u.",
233 fd, head.module, head.seq, head.flag, head.len);
234 if (head.len == 0 || head.len > AUTH_SOCKET_MAX_DATA_LEN) {
235 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_WARN, "data is out of size, abandon it.");
236 return SOFTBUS_ERR;
237 }
238 if (head.magic != (int32_t)MAGIC_NUMBER) {
239 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "magic number not match.");
240 return SOFTBUS_ERR;
241 }
242 uint8_t *data = RecvPacketData(fd, head.len);
243 if (data == NULL) {
244 return SOFTBUS_ERR;
245 }
246 NotifyDataReceived(module, fd, &head, data);
247 SoftBusFree(data);
248 return SOFTBUS_OK;
249 }
250
OnConnectEvent(ListenerModule module,int32_t cfd,const ConnectOption * clientAddr)251 NO_SANITIZE("cfi") static int32_t OnConnectEvent(ListenerModule module,
252 int32_t cfd, const ConnectOption *clientAddr)
253 {
254 if (cfd < 0) {
255 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "%s:invalid param.", __func__);
256 return SOFTBUS_INVALID_PARAM;
257 }
258 if (ConnSetTcpKeepAlive(cfd, AUTH_KEEP_ALIVE_TIME_INTERVAL) != 0) {
259 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "set keepalive fail!");
260 ConnShutdownSocket(cfd);
261 return SOFTBUS_ERR;
262 }
263 if (AddTrigger(module, cfd, READ_TRIGGER) != SOFTBUS_OK) {
264 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AddTrigger fail.");
265 ConnShutdownSocket(cfd);
266 return SOFTBUS_ERR;
267 }
268 if (module != AUTH && module != AUTH_P2P) {
269 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "newip auth process");
270 if (RouteBuildServerAuthManager(cfd, clientAddr) != SOFTBUS_OK) {
271 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "build auth manager fail.");
272 (void)DelTrigger(module, cfd, READ_TRIGGER);
273 ConnShutdownSocket(cfd);
274 return SOFTBUS_ERR;
275 }
276 return SOFTBUS_OK;
277 }
278 NotifyConnected(module, cfd, false);
279 return SOFTBUS_OK;
280 }
281
OnDataEvent(ListenerModule module,int32_t events,int32_t fd)282 NO_SANITIZE("cfi") static int32_t OnDataEvent(ListenerModule module, int32_t events, int32_t fd)
283 {
284 (void)module;
285 if (events == SOFTBUS_SOCKET_OUT) {
286 return ProcessSocketOutEvent(module, fd);
287 } else if (events == SOFTBUS_SOCKET_IN) {
288 return ProcessSocketInEvent(module, fd);
289 }
290 return SOFTBUS_ERR;
291 }
292
SetSocketCallback(const SocketCallback * cb)293 NO_SANITIZE("cfi") int32_t SetSocketCallback(const SocketCallback *cb)
294 {
295 CHECK_NULL_PTR_RETURN_VALUE(cb, SOFTBUS_INVALID_PARAM);
296 if (memcpy_s(&g_callback, sizeof(SocketCallback), cb, sizeof(SocketCallback)) != EOK) {
297 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "set SocketCallback fail.");
298 return SOFTBUS_MEM_ERR;
299 }
300 return SOFTBUS_OK;
301 }
302
UnsetSocketCallback(void)303 NO_SANITIZE("cfi") void UnsetSocketCallback(void)
304 {
305 (void)memset_s(&g_callback, sizeof(SocketCallback), 0, sizeof(SocketCallback));
306 }
307
StartSocketListening(ListenerModule module,const LocalListenerInfo * info)308 NO_SANITIZE("cfi") int32_t StartSocketListening(ListenerModule module, const LocalListenerInfo *info)
309 {
310 SoftbusBaseListener listener = {
311 .onConnectEvent = OnConnectEvent,
312 .onDataEvent = OnDataEvent,
313 };
314 int32_t port = StartBaseListener(info, &listener);
315 if (port <= 0) {
316 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "StartBaseListener fail(=%d).", port);
317 return SOFTBUS_ERR;
318 }
319 return port;
320 }
321
StopSocketListening(void)322 NO_SANITIZE("cfi") void StopSocketListening(void)
323 {
324 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "stop socket listening.");
325 if (StopBaseListener(AUTH) != SOFTBUS_OK) {
326 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "StopBaseListener fail.");
327 }
328 }
329
SocketConnectDevice(const char * ip,int32_t port,bool isBlockMode)330 NO_SANITIZE("cfi") int32_t SocketConnectDevice(const char *ip, int32_t port, bool isBlockMode)
331 {
332 char localIp[MAX_ADDR_LEN] = {0};
333 if (LnnGetLocalStrInfo(STRING_KEY_WLAN_IP, localIp, MAX_ADDR_LEN) != SOFTBUS_OK) {
334 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "get local ip fail.");
335 return AUTH_INVALID_FD;
336 }
337 ConnectOption option = {
338 .type = CONNECT_TCP,
339 .socketOption = {
340 .addr = "",
341 .port = port,
342 .moduleId = AUTH,
343 .protocol = LNN_PROTOCOL_IP
344 }
345 };
346 if (strcpy_s(option.socketOption.addr, sizeof(option.socketOption.addr), ip) != EOK) {
347 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy remote ip fail.");
348 return AUTH_INVALID_FD;
349 }
350 int32_t fd = ConnOpenClientSocket(&option, localIp, !isBlockMode);
351 if (fd < 0) {
352 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnOpenClientSocket fail.");
353 return AUTH_INVALID_FD;
354 }
355 TriggerType triggerMode = isBlockMode ? READ_TRIGGER : WRITE_TRIGGER;
356 if (AddTrigger(AUTH, fd, triggerMode) != SOFTBUS_OK) {
357 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AddTrigger fail.");
358 ConnShutdownSocket(fd);
359 return AUTH_INVALID_FD;
360 }
361 if (ConnSetTcpKeepAlive(fd, AUTH_KEEP_ALIVE_TIME_INTERVAL) != SOFTBUS_OK) {
362 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "set tcp keep alive fail.");
363 (void)DelTrigger(AUTH, fd, triggerMode);
364 ConnShutdownSocket(fd);
365 return AUTH_INVALID_FD;
366 }
367 return fd;
368 }
369
NipSocketConnectDevice(ListenerModule module,const char * addr,int32_t port,bool isBlockMode)370 NO_SANITIZE("cfi") int32_t NipSocketConnectDevice(ListenerModule module,
371 const char *addr, int32_t port, bool isBlockMode)
372 {
373 ConnectOption option = {
374 .type = CONNECT_TCP,
375 .socketOption = {
376 .addr = "",
377 .port = port,
378 .moduleId = module,
379 .protocol = LNN_PROTOCOL_NIP
380 }
381 };
382 if (strcpy_s(option.socketOption.addr, sizeof(option.socketOption.addr), addr) != EOK) {
383 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy remote ip fail.");
384 return AUTH_INVALID_FD;
385 }
386 int32_t fd = ConnOpenClientSocket(&option, BIND_ADDR_ALL, !isBlockMode);
387 if (fd < 0) {
388 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnOpenClientSocket fail.");
389 return AUTH_INVALID_FD;
390 }
391 TriggerType triggerMode = isBlockMode ? READ_TRIGGER : WRITE_TRIGGER;
392 if (AddTrigger(module, fd, triggerMode) != SOFTBUS_OK) {
393 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AddTrigger fail.");
394 ConnShutdownSocket(fd);
395 return AUTH_INVALID_FD;
396 }
397 if (ConnSetTcpKeepAlive(fd, AUTH_KEEP_ALIVE_TIME_INTERVAL) != SOFTBUS_OK) {
398 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "set tcp keep alive fail.");
399 (void)DelTrigger(module, fd, triggerMode);
400 ConnShutdownSocket(fd);
401 return AUTH_INVALID_FD;
402 }
403 return fd;
404 }
405
SocketDisconnectDevice(ListenerModule module,int32_t fd)406 NO_SANITIZE("cfi") void SocketDisconnectDevice(ListenerModule module, int32_t fd)
407 {
408 if (fd < 0) {
409 return;
410 }
411 (void)DelTrigger(module, fd, RW_TRIGGER);
412 ConnShutdownSocket(fd);
413 }
414
SocketPostBytes(int32_t fd,const AuthDataHead * head,const uint8_t * data)415 NO_SANITIZE("cfi") int32_t SocketPostBytes(int32_t fd, const AuthDataHead *head, const uint8_t *data)
416 {
417 CHECK_NULL_PTR_RETURN_VALUE(head, SOFTBUS_INVALID_PARAM);
418 CHECK_NULL_PTR_RETURN_VALUE(data, SOFTBUS_INVALID_PARAM);
419 uint32_t size = GetSocketPktSize(head->len);
420 uint8_t *buf = (uint8_t *)SoftBusCalloc(size);
421 if (buf == NULL) {
422 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "malloc pkt err.");
423 return SOFTBUS_ERR;
424 }
425 SocketPktHead pktHead = {
426 .magic = MAGIC_NUMBER,
427 .module = head->module,
428 .seq = head->seq,
429 .flag = head->flag,
430 .len = head->len,
431 };
432 if (PackSocketPkt(&pktHead, data, buf, size) != SOFTBUS_OK) {
433 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "pack socket pkt fail.");
434 SoftBusFree(buf);
435 return SOFTBUS_ERR;
436 }
437
438 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO,
439 "SocketPostBytes: fd=%d, module=%d, seq=%" PRId64 ", flag=%d, len=%u.",
440 fd, pktHead.module, pktHead.seq, pktHead.flag, pktHead.len);
441 ssize_t ret = ConnSendSocketData(fd, (const char *)buf, (size_t)size, 0);
442 SoftBusFree(buf);
443 if (ret != (ssize_t)size) {
444 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnSendSocketData fail(=%d).", ret);
445 return SOFTBUS_ERR;
446 }
447 return SOFTBUS_OK;
448 }
449
SocketGetConnInfo(int32_t fd,AuthConnInfo * connInfo,bool * isServer)450 NO_SANITIZE("cfi") int32_t SocketGetConnInfo(int32_t fd, AuthConnInfo *connInfo, bool *isServer)
451 {
452 CHECK_NULL_PTR_RETURN_VALUE(connInfo, SOFTBUS_INVALID_PARAM);
453 CHECK_NULL_PTR_RETURN_VALUE(isServer, SOFTBUS_INVALID_PARAM);
454 SocketAddr socket;
455 if (ConnGetPeerSocketAddr(fd, &socket) != SOFTBUS_OK) {
456 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnGetPeerSocketAddr fail, fd=%d.", fd);
457 return SOFTBUS_ERR;
458 }
459 int32_t localPort = ConnGetLocalSocketPort(fd);
460 if (localPort <= 0) {
461 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "ConnGetLocalSocketPort fail, fd=%d.", fd);
462 return SOFTBUS_ERR;
463 }
464 connInfo->type = AUTH_LINK_TYPE_WIFI;
465 if (strcpy_s(connInfo->info.ipInfo.ip, sizeof(connInfo->info.ipInfo.ip), socket.addr) != EOK) {
466 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "copy ip fail, fd=%d.", fd);
467 return SOFTBUS_MEM_ERR;
468 }
469 connInfo->info.ipInfo.port = socket.port;
470 int32_t serverPort = 0;
471 if (LnnGetLocalNumInfo(NUM_KEY_AUTH_PORT, &serverPort) != SOFTBUS_OK) {
472 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "get local auth port fail.");
473 return SOFTBUS_ERR;
474 }
475 *isServer = (serverPort != localPort);
476 return SOFTBUS_OK;
477 }
478
479 /* Auth Channel */
NotifyChannelDataReceived(int32_t channelId,const SocketPktHead * head,const uint8_t * data)480 NO_SANITIZE("cfi") static void NotifyChannelDataReceived(int32_t channelId, const SocketPktHead *head,
481 const uint8_t *data)
482 {
483 uint32_t i;
484 AuthChannelListener *listener = NULL;
485 for (i = 0; i < sizeof(g_listener) / sizeof(InnerChannelListener); i++) {
486 if (g_listener[i].module == head->module) {
487 listener = &g_listener[i].listener;
488 break;
489 }
490 }
491 if (listener == NULL || listener->onDataReceived == NULL) {
492 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthChannelListener not set.");
493 return;
494 }
495
496 AuthChannelData channelData = {0};
497 channelData.module = head->module;
498 channelData.seq = head->seq;
499 channelData.flag = head->flag;
500 channelData.len = head->len;
501 channelData.data = data;
502 listener->onDataReceived(channelId, &channelData);
503 }
504
NotifyChannelDisconnected(int32_t channelId)505 NO_SANITIZE("cfi") static void NotifyChannelDisconnected(int32_t channelId)
506 {
507 uint32_t i;
508 for (i = 0; i < sizeof(g_listener) / sizeof(InnerChannelListener); i++) {
509 if (g_listener[i].listener.onDisconnected != NULL) {
510 g_listener[i].listener.onDisconnected(channelId);
511 }
512 }
513 }
514
RegAuthChannelListener(int32_t module,const AuthChannelListener * listener)515 NO_SANITIZE("cfi") int32_t RegAuthChannelListener(int32_t module, const AuthChannelListener *listener)
516 {
517 if (listener == NULL || listener->onDataReceived == NULL) {
518 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthChannel: invalid listener.");
519 return SOFTBUS_INVALID_PARAM;
520 }
521 uint32_t i;
522 for (i = 0; i < sizeof(g_listener) / sizeof(InnerChannelListener); i++) {
523 if (g_listener[i].module == module) {
524 g_listener[i].listener.onDataReceived = listener->onDataReceived;
525 g_listener[i].listener.onDisconnected = listener->onDisconnected;
526 return SOFTBUS_OK;
527 }
528 }
529 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthChannel: unknown module(=%d).", module);
530 return SOFTBUS_ERR;
531 }
532
UnregAuthChannelListener(int32_t module)533 NO_SANITIZE("cfi") void UnregAuthChannelListener(int32_t module)
534 {
535 uint32_t i;
536 for (i = 0; i < sizeof(g_listener) / sizeof(InnerChannelListener); i++) {
537 if (g_listener[i].module == module) {
538 g_listener[i].listener.onDataReceived = NULL;
539 g_listener[i].listener.onDisconnected = NULL;
540 return;
541 }
542 }
543 }
544
AuthOpenChannel(const char * ip,int32_t port)545 NO_SANITIZE("cfi") int32_t AuthOpenChannel(const char *ip, int32_t port)
546 {
547 if (ip == NULL || port <= 0) {
548 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthChannel: invalid param.");
549 return INVALID_CHANNEL_ID;
550 }
551 int32_t fd = SocketConnectDevice(ip, port, true);
552 if (fd < 0) {
553 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthChannel: connect fail.");
554 return INVALID_CHANNEL_ID;
555 }
556 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "AuthChannel: open auth channel succ, channelId=%d.", fd);
557 return fd;
558 }
559
AuthCloseChannel(int32_t channelId)560 NO_SANITIZE("cfi") void AuthCloseChannel(int32_t channelId)
561 {
562 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "AuthChannel: close auth channel, id=%d.", channelId);
563 SocketDisconnectDevice(AUTH, channelId);
564 }
565
AuthPostChannelData(int32_t channelId,const AuthChannelData * data)566 NO_SANITIZE("cfi") int32_t AuthPostChannelData(int32_t channelId, const AuthChannelData *data)
567 {
568 if (channelId < 0 || data == NULL || data->data == NULL || data->len == 0) {
569 SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthChannel: invalid param, channelId=%d.", channelId);
570 return SOFTBUS_INVALID_PARAM;
571 }
572 AuthDataHead head = {
573 .dataType = DATA_TYPE_CONNECTION,
574 .module = data->module,
575 .seq = data->seq,
576 .flag = data->flag,
577 .len = data->len,
578 };
579 return SocketPostBytes(channelId, &head, data->data);
580 }
581