• 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 #include "auth_interface.h"
16 
17 #include <stdbool.h>
18 #include <stdint.h>
19 #include "auth_manager.h"
20 #include "auth_meta_manager.h"
21 
22 typedef struct {
23     int32_t module;
24     AuthTransListener listener;
25 } ModuleListener;
26 
27 static ModuleListener g_moduleListener[] = {
28     {
29         .module = MODULE_P2P_LINK,
30         .listener = { NULL, NULL },
31     },
32     {
33         .module = MODULE_P2P_LISTEN,
34         .listener = { NULL, NULL },
35     },
36     {
37         .module = MODULE_UDP_INFO,
38         .listener = { NULL, NULL },
39     },
40     {
41         .module = MODULE_TIME_SYNC,
42         .listener = { NULL, NULL },
43     }
44 };
45 
RegAuthTransListener(int32_t module,const AuthTransListener * listener)46 int32_t RegAuthTransListener(int32_t module, const AuthTransListener *listener)
47 {
48     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "AuthTrans: add listener, module = %d.", module);
49     if (listener == NULL || listener->onDataReceived == NULL) {
50         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthTrans: invalid listener.");
51         return SOFTBUS_INVALID_PARAM;
52     }
53     for (uint32_t i = 0; i < sizeof(g_moduleListener) / sizeof(ModuleListener); i++) {
54         if (g_moduleListener[i].module == module) {
55             g_moduleListener[i].listener.onDataReceived = listener->onDataReceived;
56             g_moduleListener[i].listener.onDisconnected = listener->onDisconnected;
57             return SOFTBUS_OK;
58         }
59     }
60     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "AuthTrans: unknown module(=%d).", module);
61     return SOFTBUS_ERR;
62 }
63 
UnregAuthTransListener(int32_t module)64 void UnregAuthTransListener(int32_t module)
65 {
66     SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "AuthTrans: remove listener, module=%d.", module);
67     for (uint32_t i = 0; i < sizeof(g_moduleListener) / sizeof(ModuleListener); i++) {
68         if (g_moduleListener[i].module == module) {
69             g_moduleListener[i].listener.onDataReceived = NULL;
70             g_moduleListener[i].listener.onDisconnected = NULL;
71             return;
72         }
73     }
74 }
75 
NotifyTransDataReceived(int64_t authId,const AuthDataHead * head,const uint8_t * data,uint32_t len)76 static void NotifyTransDataReceived(int64_t authId,
77     const AuthDataHead *head, const uint8_t *data, uint32_t len)
78 {
79     AuthTransListener *listener = NULL;
80     for (uint32_t i = 0; i < sizeof(g_moduleListener) / sizeof(ModuleListener); i++) {
81         if (g_moduleListener[i].module == head->module) {
82             listener = &(g_moduleListener[i].listener);
83             break;
84         }
85     }
86     if (listener == NULL || listener->onDataReceived == NULL) {
87         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_INFO, "AuthTrans: onDataReceived not found.");
88         return;
89     }
90     AuthTransData transData = {
91         .module = head->module,
92         .flag = head->flag,
93         .seq = head->seq,
94         .len = len,
95         .data = data,
96     };
97     listener->onDataReceived(authId, &transData);
98 }
99 
NotifyTransDisconnected(int64_t authId)100 static void NotifyTransDisconnected(int64_t authId)
101 {
102     for (uint32_t i = 0; i < sizeof(g_moduleListener) / sizeof(ModuleListener); i++) {
103         if (g_moduleListener[i].listener.onDisconnected != NULL) {
104             g_moduleListener[i].listener.onDisconnected(authId);
105         }
106     }
107 }
108 
AuthOpenConn(const AuthConnInfo * info,uint32_t requestId,const AuthConnCallback * callback,bool isMeta)109 int32_t AuthOpenConn(const AuthConnInfo *info, uint32_t requestId, const AuthConnCallback *callback, bool isMeta)
110 {
111     if (isMeta) {
112         return AuthMetaOpenConn(info, requestId, callback);
113     }
114     return AuthDeviceOpenConn(info, requestId, callback);
115 }
116 
AuthPostTransData(int64_t authId,const AuthTransData * dataInfo)117 int32_t AuthPostTransData(int64_t authId, const AuthTransData *dataInfo)
118 {
119     AuthManager *auth = GetAuthManagerByAuthId(authId);
120     if (auth != NULL) {
121         DelAuthManager(auth, false);
122         return AuthDevicePostTransData(authId, dataInfo);
123     }
124     return AuthMetaPostTransData(authId, dataInfo);
125 }
126 
AuthCloseConn(int64_t authId)127 void AuthCloseConn(int64_t authId)
128 {
129     AuthManager *auth = GetAuthManagerByAuthId(authId);
130     if (auth != NULL) {
131         DelAuthManager(auth, false);
132         AuthDeviceCloseConn(authId);
133         return;
134     }
135     AuthMetaCloseConn(authId);
136 }
137 
AuthGetPreferConnInfo(const char * uuid,AuthConnInfo * connInfo,bool isMeta)138 int32_t AuthGetPreferConnInfo(const char *uuid, AuthConnInfo *connInfo, bool isMeta)
139 {
140     if (isMeta) {
141         return AuthMetaGetPreferConnInfo(uuid, connInfo);
142     }
143     return AuthDeviceGetPreferConnInfo(uuid, connInfo);
144 }
145 
146 /* for ProxyChannel & P2P TcpDirectchannel */
AuthGetLatestIdByUuid(const char * uuid,bool isIpConnection,bool isMeta)147 int64_t AuthGetLatestIdByUuid(const char *uuid, bool isIpConnection, bool isMeta)
148 {
149     if (isMeta) {
150         return AUTH_INVALID_ID;
151     }
152     return AuthDeviceGetLatestIdByUuid(uuid, isIpConnection);
153 }
154 
AuthGetIdByConnInfo(const AuthConnInfo * connInfo,bool isServer,bool isMeta)155 int64_t AuthGetIdByConnInfo(const AuthConnInfo *connInfo, bool isServer, bool isMeta)
156 {
157     if (isMeta) {
158         return AuthMetaGetIdByConnInfo(connInfo, isServer);
159     }
160     return AuthDeviceGetIdByConnInfo(connInfo, isServer);
161 }
162 
AuthGetIdByP2pMac(const char * p2pMac,AuthLinkType type,bool isServer,bool isMeta)163 int64_t AuthGetIdByP2pMac(const char *p2pMac, AuthLinkType type, bool isServer, bool isMeta)
164 {
165     if (isMeta) {
166         return AuthMetaGetIdByP2pMac(p2pMac, type, isServer);
167     }
168     return AuthDeviceGetIdByP2pMac(p2pMac, type, isServer);
169 }
170 
AuthEncrypt(int64_t authId,const uint8_t * inData,uint32_t inLen,uint8_t * outData,uint32_t * outLen)171 int32_t AuthEncrypt(int64_t authId, const uint8_t *inData, uint32_t inLen, uint8_t *outData, uint32_t *outLen)
172 {
173     AuthManager *auth = GetAuthManagerByAuthId(authId);
174     if (auth != NULL) {
175         DelAuthManager(auth, false);
176         return AuthDeviceEncrypt(authId, inData, inLen, outData, outLen);
177     }
178     return AuthMetaEncrypt(authId, inData, inLen, outData, outLen);
179 }
180 
AuthDecrypt(int64_t authId,const uint8_t * inData,uint32_t inLen,uint8_t * outData,uint32_t * outLen)181 int32_t AuthDecrypt(int64_t authId, const uint8_t *inData, uint32_t inLen, uint8_t *outData, uint32_t *outLen)
182 {
183     AuthManager *auth = GetAuthManagerByAuthId(authId);
184     if (auth != NULL) {
185         DelAuthManager(auth, false);
186         return AuthDeviceDecrypt(authId, inData, inLen, outData, outLen);
187     }
188     return AuthMetaDecrypt(authId, inData, inLen, outData, outLen);
189 }
190 
AuthSetP2pMac(int64_t authId,const char * p2pMac)191 int32_t AuthSetP2pMac(int64_t authId, const char *p2pMac)
192 {
193     AuthManager *auth = GetAuthManagerByAuthId(authId);
194     if (auth != NULL) {
195         DelAuthManager(auth, false);
196         return AuthDeviceSetP2pMac(authId, p2pMac);
197     }
198     return AuthMetaSetP2pMac(authId, p2pMac);
199 }
200 
AuthGetConnInfo(int64_t authId,AuthConnInfo * connInfo)201 int32_t AuthGetConnInfo(int64_t authId, AuthConnInfo *connInfo)
202 {
203     AuthManager *auth = GetAuthManagerByAuthId(authId);
204     if (auth != NULL) {
205         DelAuthManager(auth, false);
206         return AuthDeviceGetConnInfo(authId, connInfo);
207     }
208     return AuthMetaGetConnInfo(authId, connInfo);
209 }
210 
AuthGetDeviceUuid(int64_t authId,char * uuid,uint16_t size)211 int32_t AuthGetDeviceUuid(int64_t authId, char *uuid, uint16_t size)
212 {
213     AuthManager *auth = GetAuthManagerByAuthId(authId);
214     if (auth != NULL) {
215         DelAuthManager(auth, false);
216         return AuthDeviceGetDeviceUuid(authId, uuid, size);
217     }
218     return AuthMetaGetDeviceUuid(authId, uuid, size);
219 }
220 
AuthGetVersion(int64_t authId,SoftBusVersion * version)221 int32_t AuthGetVersion(int64_t authId, SoftBusVersion *version)
222 {
223     return AuthDeviceGetVersion(authId, version);
224 }
225 
AuthGetServerSide(int64_t authId,bool * isServer)226 int32_t AuthGetServerSide(int64_t authId, bool *isServer)
227 {
228     AuthManager *auth = GetAuthManagerByAuthId(authId);
229     if (auth != NULL) {
230         DelAuthManager(auth, false);
231         return AuthDeviceGetServerSide(authId, isServer);
232     }
233     return AuthMetaGetServerSide(authId, isServer);
234 }
235 
AuthGetMetaType(int64_t authId,bool * isMetaAuth)236 int32_t AuthGetMetaType(int64_t authId, bool *isMetaAuth)
237 {
238     if (isMetaAuth == NULL) {
239         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "invalid param.");
240         return SOFTBUS_INVALID_PARAM;
241     }
242     AuthManager *auth = GetAuthManagerByAuthId(authId);
243     if (auth != NULL) {
244         DelAuthManager(auth, false);
245         *isMetaAuth = false;
246         return SOFTBUS_OK;
247     }
248     *isMetaAuth = true;
249     return SOFTBUS_OK;
250 }
251 
AuthInit(void)252 int32_t AuthInit(void)
253 {
254     AuthTransCallback callBack = {
255         .OnDataReceived = NotifyTransDataReceived,
256         .OnDisconnected = NotifyTransDisconnected,
257     };
258     int32_t ret = AuthDeviceInit(&callBack);
259     if (ret != SOFTBUS_OK) {
260         SoftBusLog(SOFTBUS_LOG_AUTH, SOFTBUS_LOG_ERROR, "auth device init failed");
261         return ret;
262     }
263     return AuthMetaInit(&callBack);
264 }
265 
AuthDeinit(void)266 void AuthDeinit(void)
267 {
268     AuthDeviceDeinit();
269     AuthMetaDeinit();
270 }
271