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