• 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 "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