• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 "ipc_adapt.h"
17 #include "common_defs.h"
18 #include "device_auth_defines.h"
19 #include "hc_log.h"
20 #include "hc_types.h"
21 #include "hc_mutex.h"
22 #include "ipc_callback_stub.h"
23 #include "ipc_dev_auth_proxy.h"
24 #include "ipc_dev_auth_stub.h"
25 #include "ipc_sdk_defines.h"
26 #include "ipc_service_lite.h"
27 #include "ipc_skeleton.h"
28 #include "securec.h"
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #define BUFF_MAX_SZ 128
35 #define IPC_CALL_BACK_MAX_NODES 64
36 
37 typedef struct {
38     uintptr_t cbHook;
39     const IpcDataInfo *cbDataCache;
40     int32_t cacheNum;
41     IpcIo *reply;
42 } CallbackParams;
43 
44 typedef void (*CallbackStub)(CallbackParams params);
45 typedef struct {
46     union {
47         DeviceAuthCallback devAuth;
48         DataChangeListener listener;
49     } cbCtx;
50     int64_t requestId;
51     char appId[BUFF_MAX_SZ];
52     int32_t cbType;
53     int32_t delOnFni;
54     int32_t methodId;
55     int32_t proxyId;
56     int32_t nodeIdx;
57 } IpcCallBackNode;
58 
59 static struct {
60     IpcCallBackNode *ctx;
61     int32_t nodeCnt;
62 } g_ipcCallBackList = {NULL, 0};
63 static HcMutex g_cbListLock;
64 
65 static StubDevAuthCb g_sdkCbStub;
66 static IClientProxy *g_proxyInstance = NULL;
67 static IpcObjectStub g_objectStub;
68 
SetIpcCallBackNodeDefault(IpcCallBackNode * node)69 static void SetIpcCallBackNodeDefault(IpcCallBackNode *node)
70 {
71     (void)memset_s(node, sizeof(IpcCallBackNode), 0, sizeof(IpcCallBackNode));
72     node->proxyId = -1;
73     node->nodeIdx = -1;
74     return;
75 }
76 
InitIpcCallBackList(void)77 int32_t InitIpcCallBackList(void)
78 {
79     int32_t i;
80 
81     LOGI("initializing ...");
82     if (g_ipcCallBackList.ctx != NULL) {
83         LOGI("has initialized");
84         return HC_SUCCESS;
85     }
86 
87     g_ipcCallBackList.ctx = HcMalloc(sizeof(IpcCallBackNode) * IPC_CALL_BACK_MAX_NODES, 0);
88     if (g_ipcCallBackList.ctx == NULL) {
89         LOGE("initialized failed");
90         return HC_ERROR;
91     }
92     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
93         SetIpcCallBackNodeDefault(g_ipcCallBackList.ctx + i);
94     }
95     (void)InitHcMutex(&g_cbListLock, false);
96     g_ipcCallBackList.nodeCnt = 0;
97     LOGI("initialized successful");
98     return HC_SUCCESS;
99 }
100 
ResetIpcCallBackNode(IpcCallBackNode * node)101 static void ResetIpcCallBackNode(IpcCallBackNode *node)
102 {
103     ResetRemoteObject(node->proxyId);
104     SetIpcCallBackNodeDefault(node);
105     return;
106 }
107 
LockCallbackList(void)108 static void LockCallbackList(void)
109 {
110     (void)LockHcMutex(&g_cbListLock);
111     return;
112 }
113 
UnLockCallbackList(void)114 static void UnLockCallbackList(void)
115 {
116     UnlockHcMutex(&g_cbListLock);
117     return;
118 }
119 
DeInitIpcCallBackList(void)120 void DeInitIpcCallBackList(void)
121 {
122     int32_t i;
123 
124     if (g_ipcCallBackList.ctx == NULL) {
125         return;
126     }
127     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
128         ResetIpcCallBackNode(g_ipcCallBackList.ctx + i);
129     }
130     HcFree((void *)g_ipcCallBackList.ctx);
131     g_ipcCallBackList.ctx = NULL;
132     DestroyHcMutex(&g_cbListLock);
133     return;
134 }
135 
ResetIpcCallBackNodeByNodeId(int32_t nodeIdx)136 void ResetIpcCallBackNodeByNodeId(int32_t nodeIdx)
137 {
138     LOGI("starting..., index %" LOG_PUB "d", nodeIdx);
139     if ((nodeIdx < 0) || (nodeIdx >= IPC_CALL_BACK_MAX_NODES)) {
140         return;
141     }
142     if (g_ipcCallBackList.ctx == NULL) {
143         return;
144     }
145     LockCallbackList();
146     ResetIpcCallBackNode(g_ipcCallBackList.ctx + nodeIdx);
147     UnLockCallbackList();
148     LOGI("done, index %" LOG_PUB "d", nodeIdx);
149     return;
150 }
151 
GetIpcCallBackByAppId(const char * appId,int32_t type)152 static IpcCallBackNode *GetIpcCallBackByAppId(const char *appId, int32_t type)
153 {
154     int32_t i;
155     int32_t ret;
156 
157     LOGI("appid: %" LOG_PUB "s", appId);
158     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
159         if (g_ipcCallBackList.ctx[i].appId[0] == 0) {
160             continue;
161         }
162         ret = strcmp(g_ipcCallBackList.ctx[i].appId, appId);
163         if ((ret == 0) && (g_ipcCallBackList.ctx[i].cbType == type)) {
164             return &g_ipcCallBackList.ctx[i];
165         }
166     }
167     return NULL;
168 }
169 
GetFreeIpcCallBackNode(void)170 static IpcCallBackNode *GetFreeIpcCallBackNode(void)
171 {
172     int32_t i;
173 
174     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
175         if ((g_ipcCallBackList.ctx[i].appId[0] == 0) && (g_ipcCallBackList.ctx[i].cbType == 0)) {
176             g_ipcCallBackList.ctx[i].nodeIdx = i;
177             return &g_ipcCallBackList.ctx[i];
178         }
179     }
180     return NULL;
181 }
182 
SetCbDeathRecipient(int32_t type,int32_t objIdx,int32_t cbDataIdx)183 static void SetCbDeathRecipient(int32_t type, int32_t objIdx, int32_t cbDataIdx)
184 {
185     if ((type == CB_TYPE_DEV_AUTH) || (type == CB_TYPE_LISTENER)) {
186         AddCbDeathRecipient(objIdx, cbDataIdx);
187     }
188     return;
189 }
190 
AddIpcCbObjByAppId(const char * appId,int32_t objIdx,int32_t type)191 void AddIpcCbObjByAppId(const char *appId, int32_t objIdx, int32_t type)
192 {
193     IpcCallBackNode *node = NULL;
194 
195     if (g_ipcCallBackList.ctx == NULL) {
196         LOGE("list not inited");
197         return;
198     }
199 
200     LockCallbackList();
201     if (g_ipcCallBackList.nodeCnt >= IPC_CALL_BACK_MAX_NODES) {
202         UnLockCallbackList();
203         LOGE("list is full");
204         return;
205     }
206 
207     node = GetIpcCallBackByAppId(appId, type);
208     if (node != NULL) {
209         node->proxyId = objIdx;
210         SetCbDeathRecipient(type, objIdx, node->nodeIdx);
211         LOGI("ipc object add success, appid: %" LOG_PUB "s, proxyId %" LOG_PUB "d", appId, node->proxyId);
212     }
213     UnLockCallbackList();
214     return;
215 }
216 
AddIpcCallBackByAppId(const char * appId,const uint8_t * cbPtr,int32_t cbSz,int32_t type)217 int32_t AddIpcCallBackByAppId(const char *appId, const uint8_t *cbPtr, int32_t cbSz, int32_t type)
218 {
219     if (g_ipcCallBackList.ctx == NULL) {
220         LOGE("list not inited");
221         return HC_ERROR;
222     }
223 
224     LockCallbackList();
225     if (g_ipcCallBackList.nodeCnt >= IPC_CALL_BACK_MAX_NODES) {
226         UnLockCallbackList();
227         LOGE("list is full");
228         return HC_ERROR;
229     }
230 
231     IpcCallBackNode *node = GetIpcCallBackByAppId(appId, type);
232     if (node != NULL) {
233         if (memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz) != EOK) {
234             UnLockCallbackList();
235             LOGE("callback context memory copy failed");
236             return HC_ERR_MEMORY_COPY;
237         }
238         if (node->proxyId >= 0) {
239             ResetRemoteObject(node->proxyId);
240             node->proxyId = -1;
241         }
242         UnLockCallbackList();
243         return HC_SUCCESS;
244     }
245 
246     node = GetFreeIpcCallBackNode();
247     if (node == NULL) {
248         UnLockCallbackList();
249         LOGE("get free node failed");
250         return HC_ERROR;
251     }
252     node->cbType = type;
253     if (memcpy_s(&(node->appId), sizeof(node->appId), appId, HcStrlen(appId) + 1) != EOK) {
254         ResetIpcCallBackNode(node);
255         UnLockCallbackList();
256         LOGE("appid memory copy failed");
257         return HC_ERROR;
258     }
259     if (memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz) != EOK) {
260         ResetIpcCallBackNode(node);
261         UnLockCallbackList();
262         LOGE("callback context memory copy failed");
263         return HC_ERROR;
264     }
265     node->proxyId = -1;
266     g_ipcCallBackList.nodeCnt++;
267     UnLockCallbackList();
268     return HC_SUCCESS;
269 }
270 
DelIpcCallBackByAppId(const char * appId,int32_t type)271 void DelIpcCallBackByAppId(const char *appId, int32_t type)
272 {
273     IpcCallBackNode *node = NULL;
274 
275     if ((g_ipcCallBackList.nodeCnt <= 0) || (g_ipcCallBackList.ctx == NULL)) {
276         return;
277     }
278 
279     LockCallbackList();
280     node = GetIpcCallBackByAppId(appId, type);
281     if (node != NULL) {
282         ResetIpcCallBackNode(node);
283         g_ipcCallBackList.nodeCnt--;
284     }
285     UnLockCallbackList();
286     return;
287 }
288 
GetIpcCallBackByReqId(int64_t reqId,int32_t type)289 static IpcCallBackNode *GetIpcCallBackByReqId(int64_t reqId, int32_t type)
290 {
291     int32_t i;
292 
293     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
294         if ((reqId == g_ipcCallBackList.ctx[i].requestId) &&
295             (g_ipcCallBackList.ctx[i].cbType == type)) {
296             return &g_ipcCallBackList.ctx[i];
297         }
298     }
299     return NULL;
300 }
301 
AddReqIdByAppId(const char * appId,int64_t reqId)302 int32_t AddReqIdByAppId(const char *appId, int64_t reqId)
303 {
304     IpcCallBackNode *node = NULL;
305 
306     if (g_ipcCallBackList.ctx == NULL) {
307         LOGE("ipc callback list not inited");
308         return HC_ERROR;
309     }
310 
311     LockCallbackList();
312     node = GetIpcCallBackByAppId(appId, CB_TYPE_DEV_AUTH);
313     if (node == NULL) {
314         UnLockCallbackList();
315         LOGE("ipc callback node not found, appid: %" LOG_PUB "s", appId);
316         return HC_ERROR;
317     }
318     node->requestId = reqId;
319     node->delOnFni = 0;
320     UnLockCallbackList();
321     LOGI("success, appid: %" LOG_PUB "s, requestId: %" LOG_PUB PRId64, appId, reqId);
322     return HC_SUCCESS;
323 }
324 
AddIpcCbObjByReqId(int64_t reqId,int32_t objIdx,int32_t type)325 void AddIpcCbObjByReqId(int64_t reqId, int32_t objIdx, int32_t type)
326 {
327     IpcCallBackNode *node = NULL;
328 
329     if (g_ipcCallBackList.ctx == NULL) {
330         LOGE("list not inited");
331         return;
332     }
333 
334     LockCallbackList();
335     if (g_ipcCallBackList.nodeCnt >= IPC_CALL_BACK_MAX_NODES) {
336         UnLockCallbackList();
337         LOGE("list is full");
338         return;
339     }
340 
341     node = GetIpcCallBackByReqId(reqId, type);
342     if (node != NULL) {
343         node->proxyId = objIdx;
344         LOGI("ipc object add success, request id %" LOG_PUB PRId64 ", type %" LOG_PUB "d, proxy id %" LOG_PUB "d",
345             reqId, type, node->proxyId);
346     }
347     UnLockCallbackList();
348     return;
349 }
350 
AddIpcCallBackByReqId(int64_t reqId,const uint8_t * cbPtr,int32_t cbSz,int32_t type)351 int32_t AddIpcCallBackByReqId(int64_t reqId, const uint8_t *cbPtr, int32_t cbSz, int32_t type)
352 {
353     errno_t eno;
354 
355     if (g_ipcCallBackList.ctx == NULL) {
356         LOGE("list is full");
357         return HC_ERROR;
358     }
359 
360     LockCallbackList();
361     if (g_ipcCallBackList.nodeCnt >= IPC_CALL_BACK_MAX_NODES) {
362         UnLockCallbackList();
363         LOGE("list is full");
364         return HC_ERROR;
365     }
366 
367     IpcCallBackNode *node = GetIpcCallBackByReqId(reqId, type);
368     if (node != NULL) {
369         eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz);
370         if (eno != EOK) {
371             UnLockCallbackList();
372             LOGE("callback context memory copy failed");
373             return HC_ERROR;
374         }
375         if (node->proxyId >= 0) {
376             ResetRemoteObject(node->proxyId);
377             node->proxyId = -1;
378         }
379         UnLockCallbackList();
380         return HC_SUCCESS;
381     }
382 
383     node = GetFreeIpcCallBackNode();
384     if (node == NULL) {
385         UnLockCallbackList();
386         LOGE("get free node failed");
387         return HC_ERROR;
388     }
389     node->cbType = type;
390     node->requestId = reqId;
391     eno = memcpy_s(&(node->cbCtx), sizeof(node->cbCtx), cbPtr, cbSz);
392     if (eno != EOK) {
393         UnLockCallbackList();
394         ResetIpcCallBackNode(node);
395         LOGE("callback context memory copy failed");
396         return HC_ERROR;
397     }
398     node->delOnFni = 1;
399     node->proxyId = -1;
400     g_ipcCallBackList.nodeCnt++;
401     UnLockCallbackList();
402     return HC_SUCCESS;
403 }
404 
DelCallBackByReqId(int64_t reqId,int32_t type)405 static void DelCallBackByReqId(int64_t reqId, int32_t type)
406 {
407     IpcCallBackNode *node = NULL;
408 
409     if ((g_ipcCallBackList.nodeCnt <= 0) || (g_ipcCallBackList.ctx == NULL)) {
410         return;
411     }
412 
413     node = GetIpcCallBackByReqId(reqId, type);
414     if ((node != NULL) && (node->delOnFni == 1)) {
415         ResetIpcCallBackNode(node);
416         g_ipcCallBackList.nodeCnt--;
417     }
418     return;
419 }
420 
DelIpcCallBackByReqId(int64_t reqId,int32_t type,bool withLock)421 void DelIpcCallBackByReqId(int64_t reqId, int32_t type, bool withLock)
422 {
423     if (withLock) {
424         LockCallbackList();
425         DelCallBackByReqId(reqId, type);
426         UnLockCallbackList();
427         return;
428     }
429     DelCallBackByReqId(reqId, type);
430     return;
431 }
432 
OnTransmitStub(CallbackParams params)433 static void OnTransmitStub(CallbackParams params)
434 {
435     int64_t requestId = 0;
436     int32_t inOutLen = sizeof(requestId);
437     uint8_t *data = NULL;
438     uint32_t dataLen = 0u;
439     bool bRet = false;
440     bool (*onTransmitHook)(int64_t, uint8_t *, uint32_t) = (bool (*)(int64_t, uint8_t *, uint32_t))(params.cbHook);
441 
442     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
443         (uint8_t *)(&requestId), &inOutLen);
444     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
445         PARAM_TYPE_COMM_DATA, (uint8_t *)&data, (int32_t *)(&dataLen));
446 
447     bRet = onTransmitHook(requestId, data, dataLen);
448     (bRet == true) ? WriteInt32(params.reply, HC_SUCCESS) : WriteInt32(params.reply, HC_ERROR);
449     return;
450 }
451 
OnSessKeyStub(CallbackParams params)452 static void OnSessKeyStub(CallbackParams params)
453 {
454     int64_t requestId = 0;
455     int32_t inOutLen = sizeof(requestId);
456     uint8_t *keyData = NULL;
457     uint32_t dataLen = 0u;
458     void (*onSessKeyHook)(int64_t, uint8_t *, uint32_t) = (void (*)(int64_t, uint8_t *, uint32_t))(params.cbHook);
459 
460     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
461         (uint8_t *)(&requestId), &inOutLen);
462     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_SESS_KEY,
463         (uint8_t *)(&keyData), (int32_t *)(&dataLen));
464 
465     onSessKeyHook(requestId, keyData, dataLen);
466     WriteInt32(params.reply, HC_SUCCESS);
467     return;
468 }
469 
OnFinishStub(CallbackParams params)470 static void OnFinishStub(CallbackParams params)
471 {
472     int64_t requestId = 0;
473     int32_t opCode = 0;
474     int32_t inOutLen;
475     char *data = NULL;
476     void (*onFinishHook)(int64_t, int32_t, char *) = (void (*)(int64_t, int32_t, char *))(params.cbHook);
477 
478     inOutLen = sizeof(requestId);
479     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
480         (uint8_t *)(&requestId), &inOutLen);
481     inOutLen = sizeof(opCode);
482     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_OPCODE,
483         (uint8_t *)(&opCode), &inOutLen);
484     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_COMM_DATA, (uint8_t *)(&data), NULL);
485 
486     onFinishHook(requestId, opCode, data);
487     WriteInt32(params.reply, HC_SUCCESS);
488     return;
489 }
490 
OnErrorStub(CallbackParams params)491 static void OnErrorStub(CallbackParams params)
492 {
493     int64_t requestId = 0;
494     int32_t opCode = 0;
495     int32_t errCode = 0;
496     int32_t inOutLen;
497     char *errInfo = NULL;
498     void (*onErrorHook)(int64_t, int32_t, int32_t, char *) =
499         (void (*)(int64_t, int32_t, int32_t, char *))(params.cbHook);
500 
501     inOutLen = sizeof(requestId);
502     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
503         (uint8_t *)(&requestId), &inOutLen);
504     inOutLen = sizeof(opCode);
505     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_OPCODE,
506         (uint8_t *)(&opCode), &inOutLen);
507     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_ERRCODE,
508         (uint8_t *)(&errCode), &inOutLen);
509     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_ERR_INFO,
510         (uint8_t *)(&errInfo), NULL);
511 
512     onErrorHook(requestId, opCode, errCode, errInfo);
513     WriteInt32(params.reply, HC_SUCCESS);
514     return;
515 }
516 
OnRequestStub(CallbackParams params)517 static void OnRequestStub(CallbackParams params)
518 {
519     int64_t requestId = 0;
520     int32_t opCode = 0;
521     int32_t inOutLen;
522     char *reqParams = NULL;
523     char *reqResult = NULL;
524     char *(*onReqHook)(int64_t, int32_t, char *) = (char *(*)(int64_t, int32_t, char *))(params.cbHook);
525 
526     inOutLen = sizeof(requestId);
527     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQID,
528         (uint8_t *)(&requestId), &inOutLen);
529     inOutLen = sizeof(opCode);
530     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_OPCODE,
531         (uint8_t *)(&opCode), &inOutLen);
532     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_REQ_INFO,
533         (uint8_t *)(&reqParams), NULL);
534 
535     reqResult = onReqHook(requestId, opCode, reqParams);
536     if (reqResult == NULL) {
537         WriteInt32(params.reply, HC_ERROR);
538         return;
539     }
540     WriteInt32(params.reply, HC_SUCCESS);
541     WriteString(params.reply, (const char *)(reqResult));
542     HcFree(reqResult);
543     reqResult = NULL;
544     return;
545 }
546 
OnGroupCreatedStub(CallbackParams params)547 static void OnGroupCreatedStub(CallbackParams params)
548 {
549     const char *groupInfo = NULL;
550     void (*onGroupCreatedHook)(const char *) = (void (*)(const char *))(params.cbHook);
551 
552     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
553         PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL);
554 
555     onGroupCreatedHook(groupInfo);
556     WriteInt32(params.reply, HC_SUCCESS);
557     return;
558 }
559 
OnGroupDeletedStub(CallbackParams params)560 static void OnGroupDeletedStub(CallbackParams params)
561 {
562     const char *groupInfo = NULL;
563     void (*onDelGroupHook)(const char *) = (void (*)(const char *))(params.cbHook);
564 
565     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
566         PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL);
567 
568     onDelGroupHook(groupInfo);
569     WriteInt32(params.reply, HC_SUCCESS);
570     return;
571 }
572 
OnDevBoundStub(CallbackParams params)573 static void OnDevBoundStub(CallbackParams params)
574 {
575     const char *groupInfo = NULL;
576     const char *udid = NULL;
577     void (*onDevBoundHook)(const char *, const char *) = (void (*)(const char *, const char *))(params.cbHook);
578 
579     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL);
580     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
581         PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL);
582 
583     onDevBoundHook(udid, groupInfo);
584     WriteInt32(params.reply, HC_SUCCESS);
585     return;
586 }
587 
OnDevUnboundStub(CallbackParams params)588 static void OnDevUnboundStub(CallbackParams params)
589 {
590     const char *groupInfo = NULL;
591     const char *udid = NULL;
592     void (*onDevUnBoundHook)(const char *, const char *) = (void (*)(const char *, const char *))(params.cbHook);
593 
594     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL);
595     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
596         PARAM_TYPE_GROUP_INFO, (uint8_t *)(&groupInfo), NULL);
597 
598     onDevUnBoundHook(udid, groupInfo);
599     WriteInt32(params.reply, HC_SUCCESS);
600     return;
601 }
602 
OnDevUnTrustStub(CallbackParams params)603 static void OnDevUnTrustStub(CallbackParams params)
604 {
605     const char *udid = NULL;
606     void (*onDevUnTrustHook)(const char *) = (void (*)(const char *))(params.cbHook);
607 
608     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL);
609 
610     onDevUnTrustHook(udid);
611     WriteInt32(params.reply, HC_SUCCESS);
612     return;
613 }
614 
OnDelLastGroupStub(CallbackParams params)615 static void OnDelLastGroupStub(CallbackParams params)
616 {
617     const char *udid = NULL;
618     int32_t groupType = 0;
619     int32_t inOutLen;
620     void (*onDelLastGroupHook)(const char *, int32_t) = (void (*)(const char *, int32_t))(params.cbHook);
621 
622     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum, PARAM_TYPE_UDID, (uint8_t *)(&udid), NULL);
623     inOutLen = sizeof(groupType);
624     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
625         PARAM_TYPE_GROUP_TYPE, (uint8_t *)(&groupType), &inOutLen);
626 
627     onDelLastGroupHook(udid, groupType);
628     WriteInt32(params.reply, HC_SUCCESS);
629     return;
630 }
631 
OnTrustDevNumChangedStub(CallbackParams params)632 static void OnTrustDevNumChangedStub(CallbackParams params)
633 {
634     int32_t devNum = 0;
635     int32_t inOutLen = sizeof(devNum);
636     void (*onTrustDevNumChangedHook)(int32_t) = (void (*)(int32_t))(params.cbHook);
637 
638     (void)GetIpcRequestParamByType(params.cbDataCache, params.cacheNum,
639         PARAM_TYPE_DATA_NUM, (uint8_t *)(&devNum), &inOutLen);
640 
641     onTrustDevNumChangedHook(devNum);
642     WriteInt32(params.reply, HC_SUCCESS);
643     return;
644 }
645 
ProcCbHook(int32_t callbackId,uintptr_t cbHook,const IpcDataInfo * cbDataCache,int32_t cacheNum,uintptr_t replyCtx)646 void ProcCbHook(int32_t callbackId, uintptr_t cbHook,
647     const IpcDataInfo *cbDataCache, int32_t cacheNum, uintptr_t replyCtx)
648 {
649     CallbackStub stubTable[] = {
650         OnTransmitStub, OnSessKeyStub, OnFinishStub, OnErrorStub,
651         OnRequestStub, OnGroupCreatedStub, OnGroupDeletedStub, OnDevBoundStub,
652         OnDevUnboundStub, OnDevUnTrustStub, OnDelLastGroupStub, OnTrustDevNumChangedStub
653     };
654     IpcIo *reply = (IpcIo *)(replyCtx);
655     if ((callbackId < CB_ID_ON_TRANS) || (callbackId > CB_ID_ON_TRUST_DEV_NUM_CHANGED)) {
656         LOGE("Invalid call back id");
657         return;
658     }
659     if (cbHook == 0x0) {
660         LOGE("Invalid call back hook");
661         return;
662     }
663     LOGI("call service callback start. CbId: %" LOG_PUB "d", callbackId);
664     CallbackParams params = { cbHook, cbDataCache, cacheNum, reply };
665     stubTable[callbackId - 1](params);
666     LOGI("call service callback end");
667     return;
668 }
669 
EncodeCallData(IpcIo * dataParcel,int32_t type,const uint8_t * param,int32_t paramSz)670 static uint32_t EncodeCallData(IpcIo *dataParcel, int32_t type, const uint8_t *param, int32_t paramSz)
671 {
672     const uint8_t *paramTmp = NULL;
673     int32_t zeroVal = 0;
674 
675     paramTmp = param;
676     if ((param == NULL) || (paramSz == 0)) {
677         paramTmp = (const uint8_t *)(&zeroVal);
678         paramSz = sizeof(zeroVal);
679     }
680     WriteInt32(dataParcel, type);
681     WriteUint32(dataParcel, (uint32_t)paramSz);
682     bool ret = WriteBuffer(dataParcel, (const void *)(paramTmp), (uint32_t)paramSz);
683     if (!ret) {
684         return (uint32_t)(HC_ERROR);
685     }
686     return (uint32_t)(HC_SUCCESS);
687 }
688 
689 /* group auth callback adapter */
GaCbOnTransmitWithType(int64_t requestId,const uint8_t * data,uint32_t dataLen,int32_t type)690 static bool GaCbOnTransmitWithType(int64_t requestId, const uint8_t *data, uint32_t dataLen, int32_t type)
691 {
692     uint32_t ret;
693     IpcIo *dataParcel = NULL;
694     IpcIo reply;
695     uint8_t dataBuf[IPC_STACK_BUFF_SZ] = { 0 };
696     IpcCallBackNode *node = NULL;
697 
698     LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
699     IpcIoInit(&reply, (void *)dataBuf, sizeof(dataBuf), 0);
700     LockCallbackList();
701     node = GetIpcCallBackByReqId(requestId, type);
702     if (node == NULL) {
703         UnLockCallbackList();
704         LOGE("onTransmit hook is null, request id %" LOG_PUB PRId64, requestId);
705         return false;
706     }
707     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
708     if (dataParcel == NULL) {
709         UnLockCallbackList();
710         return false;
711     }
712     ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (const uint8_t *)(&requestId), sizeof(requestId));
713     ret |= EncodeCallData(dataParcel, PARAM_TYPE_COMM_DATA, data, dataLen);
714     if (ret != HC_SUCCESS) {
715         UnLockCallbackList();
716         HcFree((void *)dataParcel);
717         LOGE("build trans data failed");
718         return false;
719     }
720     ActCallback(node->proxyId, CB_ID_ON_TRANS, (uintptr_t)(node->cbCtx.devAuth.onTransmit), dataParcel, &reply);
721     UnLockCallbackList();
722     HcFree((void *)dataParcel);
723     LOGI("process done, request id: %" LOG_PUB PRId64, requestId);
724     int32_t value;
725     ReadInt32(&reply, &value);
726     if (value == HC_SUCCESS) {
727         return true;
728     }
729     return false;
730 }
731 
IpcGaCbOnTransmit(int64_t requestId,const uint8_t * data,uint32_t dataLen)732 static bool IpcGaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen)
733 {
734     return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_DEV_AUTH);
735 }
736 
TmpIpcGaCbOnTransmit(int64_t requestId,const uint8_t * data,uint32_t dataLen)737 static bool TmpIpcGaCbOnTransmit(int64_t requestId, const uint8_t *data, uint32_t dataLen)
738 {
739     return GaCbOnTransmitWithType(requestId, data, dataLen, CB_TYPE_TMP_DEV_AUTH);
740 }
741 
GaCbOnSessionKeyRetWithType(int64_t requestId,const uint8_t * sessKey,uint32_t sessKeyLen,int32_t type)742 static void GaCbOnSessionKeyRetWithType(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen, int32_t type)
743 {
744     uint32_t ret;
745     IpcIo *dataParcel = NULL;
746     IpcCallBackNode *node = NULL;
747 
748     LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
749     LockCallbackList();
750     node = GetIpcCallBackByReqId(requestId, type);
751     if (node == NULL) {
752         UnLockCallbackList();
753         LOGE("onSessionKeyReturned hook is null, request id %" LOG_PUB PRId64, requestId);
754         return;
755     }
756     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
757     if (dataParcel == NULL) {
758         UnLockCallbackList();
759         return;
760     }
761     ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (uint8_t *)(&requestId), sizeof(requestId));
762     ret |= EncodeCallData(dataParcel, PARAM_TYPE_SESS_KEY, sessKey, sessKeyLen);
763     if (ret != HC_SUCCESS) {
764         UnLockCallbackList();
765         HcFree((void *)dataParcel);
766         LOGE("build trans data failed");
767         return;
768     }
769     ActCallback(node->proxyId, CB_ID_SESS_KEY_DONE,
770         (uintptr_t)(node->cbCtx.devAuth.onSessionKeyReturned), dataParcel, NULL);
771     UnLockCallbackList();
772     HcFree((void *)dataParcel);
773     LOGI("process done, request id: %" LOG_PUB PRId64, requestId);
774     return;
775 }
776 
IpcGaCbOnSessionKeyReturned(int64_t requestId,const uint8_t * sessKey,uint32_t sessKeyLen)777 static void IpcGaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen)
778 {
779     GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_DEV_AUTH);
780     return;
781 }
782 
TmpIpcGaCbOnSessionKeyReturned(int64_t requestId,const uint8_t * sessKey,uint32_t sessKeyLen)783 static void TmpIpcGaCbOnSessionKeyReturned(int64_t requestId, const uint8_t *sessKey, uint32_t sessKeyLen)
784 {
785     GaCbOnSessionKeyRetWithType(requestId, sessKey, sessKeyLen, CB_TYPE_TMP_DEV_AUTH);
786     return;
787 }
788 
GaCbOnFinishWithType(int64_t requestId,int32_t operationCode,const char * returnData,int32_t type)789 static void GaCbOnFinishWithType(int64_t requestId, int32_t operationCode, const char *returnData, int32_t type)
790 {
791     uint32_t ret;
792     IpcIo *dataParcel = NULL;
793     IpcCallBackNode *node = NULL;
794 
795     LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
796     LockCallbackList();
797     node = GetIpcCallBackByReqId(requestId, type);
798     if (node == NULL) {
799         UnLockCallbackList();
800         LOGE("onFinish hook is null, request id %" LOG_PUB PRId64, requestId);
801         return;
802     }
803     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
804     if (dataParcel == NULL) {
805         UnLockCallbackList();
806         return;
807     }
808     ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (uint8_t *)(&requestId), sizeof(requestId));
809     ret |= EncodeCallData(dataParcel, PARAM_TYPE_OPCODE, (uint8_t *)(&operationCode), sizeof(operationCode));
810     if (returnData != NULL) {
811         ret |= EncodeCallData(dataParcel, PARAM_TYPE_COMM_DATA, (const uint8_t *)(returnData),
812             HcStrlen(returnData) + 1);
813     }
814     if (ret != HC_SUCCESS) {
815         UnLockCallbackList();
816         HcFree((void *)dataParcel);
817         LOGE("build trans data failed");
818         return;
819     }
820     ActCallback(node->proxyId, CB_ID_ON_FINISH, (uintptr_t)(node->cbCtx.devAuth.onFinish), dataParcel, NULL);
821     /* delete request id */
822     DelIpcCallBackByReqId(requestId, type, false);
823     UnLockCallbackList();
824     HcFree((void *)dataParcel);
825     LOGI("process done, request id: %" LOG_PUB PRId64, requestId);
826     return;
827 }
828 
IpcGaCbOnFinish(int64_t requestId,int32_t operationCode,const char * returnData)829 static void IpcGaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData)
830 {
831     GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_DEV_AUTH);
832     return;
833 }
834 
TmpIpcGaCbOnFinish(int64_t requestId,int32_t operationCode,const char * returnData)835 static void TmpIpcGaCbOnFinish(int64_t requestId, int32_t operationCode, const char *returnData)
836 {
837     GaCbOnFinishWithType(requestId, operationCode, returnData, CB_TYPE_TMP_DEV_AUTH);
838     return;
839 }
840 
GaCbOnErrorWithType(int64_t requestId,int32_t operationCode,int32_t errorCode,const char * errorReturn,int32_t type)841 static void GaCbOnErrorWithType(int64_t requestId, int32_t operationCode,
842     int32_t errorCode, const char *errorReturn, int32_t type)
843 {
844     uint32_t ret;
845     IpcIo *dataParcel = NULL;
846     IpcCallBackNode *node = NULL;
847 
848     LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
849     LockCallbackList();
850     node = GetIpcCallBackByReqId(requestId, type);
851     if (node == NULL) {
852         UnLockCallbackList();
853         LOGE("onError hook is null, request id %" LOG_PUB PRId64, requestId);
854         return;
855     }
856     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
857     if (dataParcel == NULL) {
858         UnLockCallbackList();
859         return;
860     }
861     ret = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (uint8_t *)(&requestId), sizeof(requestId));
862     ret |= EncodeCallData(dataParcel, PARAM_TYPE_OPCODE, (uint8_t *)(&operationCode), sizeof(operationCode));
863     ret |= EncodeCallData(dataParcel, PARAM_TYPE_ERRCODE, (uint8_t *)(&errorCode), sizeof(errorCode));
864     if (errorReturn != NULL) {
865         ret |= EncodeCallData(dataParcel, PARAM_TYPE_ERR_INFO, (const uint8_t *)(errorReturn),
866             HcStrlen(errorReturn) + 1);
867     }
868     if (ret != HC_SUCCESS) {
869         UnLockCallbackList();
870         HcFree((void *)dataParcel);
871         LOGE("build trans data failed");
872         return;
873     }
874     ActCallback(node->proxyId, CB_ID_ON_ERROR, (uintptr_t)(node->cbCtx.devAuth.onError), dataParcel, NULL);
875     /* delete request id */
876     DelIpcCallBackByReqId(requestId, type, false);
877     UnLockCallbackList();
878     HcFree((void *)dataParcel);
879     LOGI("process done, request id: %" LOG_PUB PRId64, requestId);
880     return;
881 }
882 
IpcGaCbOnError(int64_t requestId,int32_t operationCode,int32_t errorCode,const char * errorReturn)883 static void IpcGaCbOnError(int64_t requestId, int32_t operationCode, int32_t errorCode, const char *errorReturn)
884 {
885     GaCbOnErrorWithType(requestId, operationCode, errorCode, errorReturn, CB_TYPE_DEV_AUTH);
886     return;
887 }
888 
TmpIpcGaCbOnError(int64_t requestId,int32_t operationCode,int32_t errorCode,const char * errorReturn)889 static void TmpIpcGaCbOnError(int64_t requestId, int32_t operationCode, int32_t errorCode, const char *errorReturn)
890 {
891     GaCbOnErrorWithType(requestId, operationCode, errorCode, errorReturn, CB_TYPE_TMP_DEV_AUTH);
892     return;
893 }
894 
GaCbOnRequestWithType(int64_t requestId,int32_t operationCode,const char * reqParams,int32_t type)895 static char *GaCbOnRequestWithType(int64_t requestId, int32_t operationCode, const char *reqParams, int32_t type)
896 {
897     int32_t ret;
898     uint32_t uRet;
899     IpcIo *dataParcel = NULL;
900     IpcIo reply;
901     uint8_t dataBuf[IPC_STACK_BUFF_SZ] = { 0 };
902     const char *dPtr = NULL;
903     IpcCallBackNode *node = NULL;
904 
905     LOGI("starting ... request id: %" LOG_PUB PRId64 ", type %" LOG_PUB "d", requestId, type);
906     IpcIoInit(&reply, (void *)dataBuf, sizeof(dataBuf), 0);
907     LockCallbackList();
908     node = GetIpcCallBackByReqId(requestId, type);
909     if (node == NULL) {
910         UnLockCallbackList();
911         LOGE("onRequest hook is null, request id %" LOG_PUB PRId64, requestId);
912         return NULL;
913     }
914     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
915     if (dataParcel == NULL) {
916         UnLockCallbackList();
917         return NULL;
918     }
919     uRet = EncodeCallData(dataParcel, PARAM_TYPE_REQID, (uint8_t *)(&requestId), sizeof(requestId));
920     uRet |= EncodeCallData(dataParcel, PARAM_TYPE_OPCODE, (uint8_t *)(&operationCode), sizeof(operationCode));
921     if (reqParams != NULL) {
922         uRet |= EncodeCallData(dataParcel, PARAM_TYPE_REQ_INFO, (const uint8_t *)(reqParams), HcStrlen(reqParams) + 1);
923     }
924     if (uRet != HC_SUCCESS) {
925         UnLockCallbackList();
926         HcFree((void *)dataParcel);
927         LOGE("build trans data failed");
928         return NULL;
929     }
930 
931     ActCallback(node->proxyId, CB_ID_ON_REQUEST, (uintptr_t)(node->cbCtx.devAuth.onRequest), dataParcel, &reply);
932     UnLockCallbackList();
933     HcFree((void *)dataParcel);
934     ReadInt32(&reply, &ret);
935     if (ret == HC_SUCCESS) {
936         dPtr = (const char *)ReadString(&reply, NULL);
937     }
938     LOGI("process done, request id: %" LOG_PUB PRId64 ", %" LOG_PUB "s result", requestId,
939         (dPtr != NULL) ? "valid" : "invalid");
940     return (dPtr != NULL) ? strdup(dPtr) : NULL;
941 }
942 
CanFindCbByReqId(int64_t requestId)943 static bool CanFindCbByReqId(int64_t requestId)
944 {
945     LockCallbackList();
946     IpcCallBackNode *node = GetIpcCallBackByReqId(requestId, CB_TYPE_DEV_AUTH);
947     UnLockCallbackList();
948     return (node != NULL) ? true : false;
949 }
950 
IpcGaCbOnRequest(int64_t requestId,int32_t operationCode,const char * reqParams)951 static char *IpcGaCbOnRequest(int64_t requestId, int32_t operationCode, const char *reqParams)
952 {
953     if (!CanFindCbByReqId(requestId)) {
954         CJson *reqParamsJson = CreateJsonFromString(reqParams);
955         if (reqParamsJson == NULL) {
956             LOGE("failed to create json from string!");
957             return NULL;
958         }
959         const char *callerAppId = GetStringFromJson(reqParamsJson, FIELD_APP_ID);
960         if (callerAppId == NULL) {
961             LOGE("failed to get appId from json object!");
962             FreeJson(reqParamsJson);
963             return NULL;
964         }
965         int32_t ret = AddReqIdByAppId(callerAppId, requestId);
966         FreeJson(reqParamsJson);
967         if (ret != HC_SUCCESS) {
968             return NULL;
969         }
970     }
971     return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_DEV_AUTH);
972 }
973 
TmpIpcGaCbOnRequest(int64_t requestId,int32_t operationCode,const char * reqParams)974 static char *TmpIpcGaCbOnRequest(int64_t requestId, int32_t operationCode, const char *reqParams)
975 {
976     return GaCbOnRequestWithType(requestId, operationCode, reqParams, CB_TYPE_TMP_DEV_AUTH);
977 }
978 
IpcOnGroupCreated(const char * groupInfo)979 void IpcOnGroupCreated(const char *groupInfo)
980 {
981     int32_t i;
982     uint32_t ret;
983     IpcIo *dataParcel = NULL;
984     DataChangeListener *listener = NULL;
985 
986     if (groupInfo == NULL) {
987         LOGE("IpcOnGroupCreated, params error");
988         return;
989     }
990 
991     LockCallbackList();
992     if (g_ipcCallBackList.ctx == NULL) {
993         UnLockCallbackList();
994         LOGE("IpcCallBackList un-initialized");
995         return;
996     }
997     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
998     if (dataParcel == NULL) {
999         UnLockCallbackList();
1000         return;
1001     }
1002 
1003     ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1004     if (ret != HC_SUCCESS) {
1005         UnLockCallbackList();
1006         HcFree((void *)dataParcel);
1007         LOGE("IpcGaCbOnRequest, build trans data failed");
1008         return;
1009     }
1010 
1011     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1012         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1013             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1014             if (listener->onGroupCreated == NULL) {
1015                 continue;
1016             }
1017             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_CREATED,
1018                 (uintptr_t)(listener->onGroupCreated), dataParcel, NULL);
1019         }
1020     }
1021     UnLockCallbackList();
1022     HcFree((void *)dataParcel);
1023     return;
1024 }
1025 
IpcOnGroupDeleted(const char * groupInfo)1026 void IpcOnGroupDeleted(const char *groupInfo)
1027 {
1028     int32_t i;
1029     uint32_t ret;
1030     IpcIo *dataParcel = NULL;
1031     DataChangeListener *listener = NULL;
1032 
1033     if (groupInfo == NULL) {
1034         LOGE("IpcOnGroupDeleted, params error");
1035         return;
1036     }
1037 
1038     LockCallbackList();
1039     if (g_ipcCallBackList.ctx == NULL) {
1040         UnLockCallbackList();
1041         LOGE("IpcCallBackList un-initialized");
1042         return;
1043     }
1044     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1045     if (dataParcel == NULL) {
1046         UnLockCallbackList();
1047         return;
1048     }
1049 
1050     ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1051     if (ret != HC_SUCCESS) {
1052         UnLockCallbackList();
1053         HcFree((void *)dataParcel);
1054         LOGE("IpcGaCbOnRequest, build trans data failed");
1055         return;
1056     }
1057 
1058     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1059         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1060             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1061             if (listener->onGroupDeleted == NULL) {
1062                 continue;
1063             }
1064             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_DELETED,
1065                 (uintptr_t)(listener->onGroupDeleted), dataParcel, NULL);
1066         }
1067     }
1068     UnLockCallbackList();
1069     HcFree((void *)dataParcel);
1070     return;
1071 }
1072 
IpcOnDeviceBound(const char * peerUdid,const char * groupInfo)1073 void IpcOnDeviceBound(const char *peerUdid, const char *groupInfo)
1074 {
1075     int32_t i;
1076     uint32_t ret;
1077     IpcIo *dataParcel = NULL;
1078     DataChangeListener *listener = NULL;
1079 
1080     if ((peerUdid == NULL) || (groupInfo == NULL)) {
1081         LOGE("params error");
1082         return;
1083     }
1084 
1085     LockCallbackList();
1086     if (g_ipcCallBackList.ctx == NULL) {
1087         UnLockCallbackList();
1088         LOGE("IpcCallBackList un-initialized");
1089         return;
1090     }
1091     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1092     if (dataParcel == NULL) {
1093         UnLockCallbackList();
1094         return;
1095     }
1096 
1097     ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1098     ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1099     if (ret != HC_SUCCESS) {
1100         UnLockCallbackList();
1101         HcFree((void *)dataParcel);
1102         LOGE("build trans data failed");
1103         return;
1104     }
1105 
1106     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1107         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1108             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1109             if (listener->onDeviceBound == NULL) {
1110                 continue;
1111             }
1112             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_BOUND,
1113                 (uintptr_t)(listener->onDeviceBound), dataParcel, NULL);
1114         }
1115     }
1116     UnLockCallbackList();
1117     HcFree((void *)dataParcel);
1118     return;
1119 }
1120 
IpcOnDeviceUnBound(const char * peerUdid,const char * groupInfo)1121 void IpcOnDeviceUnBound(const char *peerUdid, const char *groupInfo)
1122 {
1123     int32_t i;
1124     uint32_t ret;
1125     IpcIo *dataParcel = NULL;
1126     DataChangeListener *listener = NULL;
1127 
1128     if ((peerUdid == NULL) || (groupInfo == NULL)) {
1129         LOGE("params error");
1130         return;
1131     }
1132 
1133     LockCallbackList();
1134     if (g_ipcCallBackList.ctx == NULL) {
1135         UnLockCallbackList();
1136         LOGE("IpcCallBackList un-initialized");
1137         return;
1138     }
1139     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1140     if (dataParcel == NULL) {
1141         UnLockCallbackList();
1142         return;
1143     }
1144 
1145     ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1146     ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1147     if (ret != HC_SUCCESS) {
1148         UnLockCallbackList();
1149         HcFree((void *)dataParcel);
1150         LOGE("build trans data failed");
1151         return;
1152     }
1153 
1154     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1155         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1156             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1157             if (listener->onDeviceUnBound == NULL) {
1158                 continue;
1159             }
1160             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNBOUND,
1161                 (uintptr_t)(listener->onDeviceUnBound), dataParcel, NULL);
1162         }
1163     }
1164     UnLockCallbackList();
1165     HcFree((void *)dataParcel);
1166     return;
1167 }
1168 
IpcOnDeviceNotTrusted(const char * peerUdid)1169 void IpcOnDeviceNotTrusted(const char *peerUdid)
1170 {
1171     int32_t i;
1172     uint32_t ret;
1173     IpcIo *dataParcel = NULL;
1174     DataChangeListener *listener = NULL;
1175 
1176     if (peerUdid == NULL) {
1177         LOGE("params error");
1178         return;
1179     }
1180 
1181     LockCallbackList();
1182     if (g_ipcCallBackList.ctx == NULL) {
1183         UnLockCallbackList();
1184         LOGE("IpcCallBackList un-initialized");
1185         return;
1186     }
1187     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1188     if (dataParcel == NULL) {
1189         UnLockCallbackList();
1190         return;
1191     }
1192 
1193     ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1194     if (ret != HC_SUCCESS) {
1195         UnLockCallbackList();
1196         HcFree((void *)dataParcel);
1197         LOGE("build trans data failed");
1198         return;
1199     }
1200 
1201     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1202         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1203             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1204             if (listener->onDeviceNotTrusted == NULL) {
1205                 continue;
1206             }
1207             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNTRUSTED,
1208                 (uintptr_t)(listener->onDeviceNotTrusted), dataParcel, NULL);
1209         }
1210     }
1211     UnLockCallbackList();
1212     HcFree((void *)dataParcel);
1213     return;
1214 }
1215 
IpcOnLastGroupDeleted(const char * peerUdid,int32_t groupType)1216 void IpcOnLastGroupDeleted(const char *peerUdid, int32_t groupType)
1217 {
1218     int32_t i;
1219     uint32_t ret;
1220     IpcIo *dataParcel = NULL;
1221     DataChangeListener *listener = NULL;
1222 
1223     if (peerUdid == NULL) {
1224         LOGE("params error");
1225         return;
1226     }
1227 
1228     LockCallbackList();
1229     if (g_ipcCallBackList.ctx == NULL) {
1230         UnLockCallbackList();
1231         LOGE("IpcCallBackList un-initialized");
1232         return;
1233     }
1234     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1235     if (dataParcel == NULL) {
1236         UnLockCallbackList();
1237         return;
1238     }
1239 
1240     ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1241     ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_TYPE, (const uint8_t *)(&groupType), sizeof(groupType));
1242     if (ret != HC_SUCCESS) {
1243         UnLockCallbackList();
1244         HcFree((void *)dataParcel);
1245         LOGE("build trans data failed");
1246         return;
1247     }
1248 
1249     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1250         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1251             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1252             if (listener->onLastGroupDeleted == NULL) {
1253                 continue;
1254             }
1255             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_LAST_GROUP_DELETED,
1256                 (uintptr_t)(listener->onLastGroupDeleted), dataParcel, NULL);
1257         }
1258     }
1259     UnLockCallbackList();
1260     HcFree((void *)dataParcel);
1261     return;
1262 }
1263 
IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum)1264 void IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum)
1265 {
1266     int32_t i;
1267     uint32_t ret;
1268     IpcIo *dataParcel = NULL;
1269     DataChangeListener *listener = NULL;
1270 
1271     LockCallbackList();
1272     if (g_ipcCallBackList.ctx == NULL) {
1273         UnLockCallbackList();
1274         LOGE("IpcCallBackList un-initialized");
1275         return;
1276     }
1277 
1278     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1279     if (dataParcel == NULL) {
1280         UnLockCallbackList();
1281         return;
1282     }
1283     ret = EncodeCallData(dataParcel, PARAM_TYPE_DATA_NUM,
1284         (const uint8_t *)(&curTrustedDeviceNum), sizeof(curTrustedDeviceNum));
1285     if (ret != HC_SUCCESS) {
1286         UnLockCallbackList();
1287         HcFree((void *)dataParcel);
1288         LOGE("IpcOnTrustedDeviceNumChanged, build trans data failed");
1289         return;
1290     }
1291 
1292     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1293         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1294             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1295             if (listener->onTrustedDeviceNumChanged == NULL) {
1296                 continue;
1297             }
1298             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_TRUST_DEV_NUM_CHANGED,
1299                 (uintptr_t)(listener->onTrustedDeviceNumChanged), dataParcel, NULL);
1300         }
1301     }
1302     UnLockCallbackList();
1303     HcFree((void *)dataParcel);
1304     return;
1305 }
1306 
InitDeviceAuthCbCtx(DeviceAuthCallback * ctx,int32_t type)1307 void InitDeviceAuthCbCtx(DeviceAuthCallback *ctx, int32_t type)
1308 {
1309     if (ctx == NULL) {
1310         return;
1311     }
1312     if (type == CB_TYPE_DEV_AUTH) {
1313         ctx->onTransmit = IpcGaCbOnTransmit;
1314         ctx->onSessionKeyReturned = IpcGaCbOnSessionKeyReturned;
1315         ctx->onFinish = IpcGaCbOnFinish;
1316         ctx->onError = IpcGaCbOnError;
1317         ctx->onRequest = IpcGaCbOnRequest;
1318     }
1319     if (type == CB_TYPE_TMP_DEV_AUTH) {
1320         ctx->onTransmit = TmpIpcGaCbOnTransmit;
1321         ctx->onSessionKeyReturned = TmpIpcGaCbOnSessionKeyReturned;
1322         ctx->onFinish = TmpIpcGaCbOnFinish;
1323         ctx->onError = TmpIpcGaCbOnError;
1324         ctx->onRequest = TmpIpcGaCbOnRequest;
1325     }
1326     return;
1327 }
1328 
InitDevAuthListenerCbCtx(DataChangeListener * ctx)1329 void InitDevAuthListenerCbCtx(DataChangeListener *ctx)
1330 {
1331     if (ctx == NULL) {
1332         return;
1333     }
1334     ctx->onGroupCreated = IpcOnGroupCreated;
1335     ctx->onGroupDeleted = IpcOnGroupDeleted;
1336     ctx->onDeviceBound = IpcOnDeviceBound;
1337     ctx->onDeviceUnBound = IpcOnDeviceUnBound;
1338     ctx->onDeviceNotTrusted = IpcOnDeviceNotTrusted;
1339     ctx->onLastGroupDeleted = IpcOnLastGroupDeleted;
1340     ctx->onTrustedDeviceNumChanged = IpcOnTrustedDeviceNumChanged;
1341     return;
1342 }
1343 
1344 /* ipc client process adapter */
CreateCallCtx(uintptr_t * callCtx,uintptr_t * cbCtx)1345 int32_t CreateCallCtx(uintptr_t *callCtx, uintptr_t *cbCtx)
1346 {
1347     ProxyDevAuthData *dataCache = NULL;
1348 
1349     (void)cbCtx;
1350     if (callCtx == NULL) {
1351         return HC_ERR_INVALID_PARAMS;
1352     }
1353 
1354     dataCache = (ProxyDevAuthData *)HcMalloc(sizeof(ProxyDevAuthData), 0);
1355     if (dataCache == NULL) {
1356         LOGE("call context alloc failed");
1357         return HC_ERR_ALLOC_MEMORY;
1358     }
1359     dataCache->data = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1360     dataCache->tmpData = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1361     dataCache->reply = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1362     if ((dataCache->data == NULL) || (dataCache->tmpData == NULL) || (dataCache->reply == NULL)) {
1363         DestroyCallCtx((uintptr_t *)(dataCache), NULL);
1364         return HC_ERROR;
1365     }
1366     /* linux lite, ipc io init with : token + SvcIdentity */
1367     dataCache->ioBuffOffset = IpcIoBufferOffset();
1368     *callCtx = (uintptr_t)(dataCache);
1369     return HC_SUCCESS;
1370 }
1371 
DestroyCallCtx(uintptr_t * callCtx,uintptr_t * cbCtx)1372 void DestroyCallCtx(uintptr_t *callCtx, uintptr_t *cbCtx)
1373 {
1374     ProxyDevAuthData *dataCache = NULL;
1375 
1376     (void)cbCtx;
1377     if ((callCtx != NULL) && (*callCtx != 0)) {
1378         dataCache = (ProxyDevAuthData *)(*callCtx);
1379         if (dataCache->data != NULL) {
1380             HcFree((void *)dataCache->data);
1381             dataCache->data = NULL;
1382         }
1383         if (dataCache->tmpData != NULL) {
1384             HcFree((void *)dataCache->tmpData);
1385             dataCache->tmpData = NULL;
1386         }
1387         if (dataCache->reply != NULL) {
1388             HcFree((void *)dataCache->reply);
1389             dataCache->reply = NULL;
1390         }
1391         HcFree((void *)dataCache);
1392         *callCtx = 0;
1393     }
1394     return;
1395 }
1396 
SetCbCtxToDataCtx(uintptr_t callCtx,int32_t cbIdx)1397 void SetCbCtxToDataCtx(uintptr_t callCtx, int32_t cbIdx)
1398 {
1399     ProxyDevAuthData *dataCache = NULL;
1400     const SvcIdentity *stubInfo = &g_sdkCbStub.stubIdentity;
1401     (void)cbIdx;
1402     if (!g_sdkCbStub.registered) {
1403         LOGW("SDK callback stub un-registered");
1404         return;
1405     }
1406     ShowIpcSvcInfo(stubInfo);
1407     dataCache = (ProxyDevAuthData *)(callCtx);
1408     SetCallbackStub(dataCache, stubInfo);
1409     return;
1410 }
1411 
SetCallRequestParamInfo(uintptr_t callCtx,int32_t type,const uint8_t * param,int32_t paramSz)1412 int32_t SetCallRequestParamInfo(uintptr_t callCtx, int32_t type, const uint8_t *param, int32_t paramSz)
1413 {
1414     ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1415 
1416     return EncodeCallRequest(dataCache, type, param, paramSz);
1417 }
1418 
DoBinderCall(uintptr_t callCtx,int32_t methodId,bool withSync)1419 int32_t DoBinderCall(uintptr_t callCtx, int32_t methodId, bool withSync)
1420 {
1421     (void)withSync;
1422     int32_t ret;
1423     ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1424 
1425     ret = FinalCallRequest(dataCache, methodId);
1426     if (ret != HC_SUCCESS) {
1427         return ret;
1428     }
1429     return ActCall(g_proxyInstance, dataCache);
1430 }
1431 
1432 /* ipc service process adapter */
SetIpcCallMap(uintptr_t ipcInstance,IpcServiceCall method,int32_t methodId)1433 uint32_t SetIpcCallMap(uintptr_t ipcInstance, IpcServiceCall method, int32_t methodId)
1434 {
1435     (void)ipcInstance;
1436     if ((method == NULL) || (methodId <= 0)) {
1437         return HC_ERR_INVALID_PARAMS;
1438     }
1439 
1440     return (uint32_t)SetCallMap(method, methodId);
1441 }
1442 
CreateServiceInstance(uintptr_t * ipcInstance)1443 int32_t CreateServiceInstance(uintptr_t *ipcInstance)
1444 {
1445     *ipcInstance = 0x0;
1446     return HC_SUCCESS;
1447 }
1448 
DestroyServiceInstance(uintptr_t ipcInstance)1449 void DestroyServiceInstance(uintptr_t ipcInstance)
1450 {
1451     (void)ipcInstance;
1452 }
1453 
AddDevAuthServiceToManager(uintptr_t serviceInstance)1454 int32_t AddDevAuthServiceToManager(uintptr_t serviceInstance)
1455 {
1456     (void)serviceInstance;
1457     SAMGR_Bootstrap();
1458     InitCbStubTable();
1459     LOGI("AddSystemAbility to SA manager success");
1460     return HC_SUCCESS;
1461 }
1462 
IpcEncodeCallReply(uintptr_t replayCache,int32_t type,const uint8_t * result,int32_t resultSz)1463 int32_t IpcEncodeCallReply(uintptr_t replayCache, int32_t type, const uint8_t *result, int32_t resultSz)
1464 {
1465     int32_t ret = HC_SUCCESS;
1466     IpcIo *replyParcel = NULL;
1467     unsigned long valZero = 0uL;
1468 
1469     replyParcel = (IpcIo *)(replayCache);
1470     WriteInt32(replyParcel, type);
1471     bool value;
1472     if ((result != NULL) && (resultSz > 0)) {
1473         WriteUint32(replyParcel, (uint32_t)resultSz);
1474         value = WriteBuffer(replyParcel, (const void *)result, (uint32_t)resultSz);
1475     } else {
1476         WriteUint32(replyParcel, sizeof(valZero));
1477         value = WriteBuffer(replyParcel, (const void *)(&valZero), sizeof(valZero));
1478     }
1479     if (!value) {
1480         LOGE("encode call reply fail.");
1481         return HC_FALSE;
1482     }
1483     return ret;
1484 }
1485 
DecodeIpcData(uintptr_t data,int32_t * type,uint8_t ** val,int32_t * valSz)1486 int32_t DecodeIpcData(uintptr_t data, int32_t *type, uint8_t **val, int32_t *valSz)
1487 {
1488     IpcIo *dataPtr = NULL;
1489 
1490     dataPtr = (IpcIo *)(data);
1491     if (dataPtr->bufferLeft <= 0) {
1492         return HC_SUCCESS;
1493     }
1494     ReadInt32(dataPtr, type);
1495     ReadUint32(dataPtr, (uint32_t *)valSz);
1496     *val = (uint8_t *)ReadBuffer(dataPtr, *valSz);
1497     return HC_SUCCESS;
1498 }
1499 
DecodeCallReply(uintptr_t callCtx,IpcDataInfo * replyCache,int32_t cacheNum)1500 void DecodeCallReply(uintptr_t callCtx, IpcDataInfo *replyCache, int32_t cacheNum)
1501 {
1502     int32_t i;
1503     int32_t ret;
1504     uint32_t replyLen;
1505 
1506     ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1507     ReadUint32(dataCache->reply, &replyLen);
1508     if (replyLen == 0) {
1509         return;
1510     }
1511 
1512     for (i = 0; i < cacheNum; i++) {
1513         ret = DecodeIpcData((uintptr_t)(dataCache->reply),
1514             &(replyCache[i].type), &(replyCache[i].val), &(replyCache[i].valSz));
1515         if (ret != HC_SUCCESS) {
1516             return;
1517         }
1518     }
1519     return;
1520 }
1521 
IsTypeForSettingPtr(int32_t type)1522 static bool IsTypeForSettingPtr(int32_t type)
1523 {
1524     int32_t typeList[] = {
1525         PARAM_TYPE_APPID, PARAM_TYPE_DEV_AUTH_CB, PARAM_TYPE_LISTERNER, PARAM_TYPE_CREATE_PARAMS,
1526         PARAM_TYPE_GROUPID, PARAM_TYPE_UDID, PARAM_TYPE_ADD_PARAMS, PARAM_TYPE_DEL_PARAMS,
1527         PARAM_TYPE_QUERY_PARAMS, PARAM_TYPE_COMM_DATA, PARAM_TYPE_SESS_KEY,
1528         PARAM_TYPE_REQ_INFO, PARAM_TYPE_GROUP_INFO, PARAM_TYPE_AUTH_PARAMS, PARAM_TYPE_REQ_JSON,
1529         PARAM_TYPE_PSEUDONYM_ID, PARAM_TYPE_INDEX_KEY, PARAM_TYPE_ERR_INFO
1530     };
1531     int32_t i;
1532     int32_t n = sizeof(typeList) / sizeof(typeList[0]);
1533     for (i = 0; i < n; i++) {
1534         if (typeList[i] == type) {
1535             return true;
1536         }
1537     }
1538     return false;
1539 }
1540 
IsTypeForCpyData(int32_t type)1541 static bool IsTypeForCpyData(int32_t type)
1542 {
1543     int32_t typeList[] = {
1544         PARAM_TYPE_REQID, PARAM_TYPE_GROUP_TYPE, PARAM_TYPE_OPCODE, PARAM_TYPE_ERRCODE, PARAM_TYPE_OS_ACCOUNT_ID
1545     };
1546     int32_t i;
1547     int32_t n = sizeof(typeList) / sizeof(typeList[0]);
1548     for (i = 0; i < n; i++) {
1549         if (typeList[i] == type) {
1550             return true;
1551         }
1552     }
1553     return false;
1554 }
1555 
GetIpcRequestParamByType(const IpcDataInfo * ipcParams,int32_t paramNum,int32_t type,uint8_t * paramCache,int32_t * cacheLen)1556 int32_t GetIpcRequestParamByType(const IpcDataInfo *ipcParams, int32_t paramNum,
1557     int32_t type, uint8_t *paramCache, int32_t *cacheLen)
1558 {
1559     int32_t i;
1560     int32_t ret = HC_ERR_IPC_BAD_MSG_TYPE;
1561     errno_t eno;
1562 
1563     for (i = 0; i < paramNum; i++) {
1564         if (ipcParams[i].type != type) {
1565             continue;
1566         }
1567         ret = HC_SUCCESS;
1568         if (IsTypeForSettingPtr(type)) {
1569             *(uint8_t **)paramCache = ipcParams[i].val;
1570             if (cacheLen != NULL) {
1571                 *cacheLen = ipcParams[i].valSz;
1572             }
1573             break;
1574         }
1575         if (IsTypeForCpyData(type)) {
1576             if ((ipcParams[i].val == NULL) || (ipcParams[i].valSz <= 0)) {
1577                 ret = HC_ERR_INVALID_PARAMS;
1578                 break;
1579             }
1580             eno = memcpy_s(paramCache, *cacheLen, ipcParams[i].val, ipcParams[i].valSz);
1581             if (eno != EOK) {
1582                 ret = HC_ERR_MEMORY_COPY;
1583             }
1584             *cacheLen = ipcParams[i].valSz;
1585             break;
1586         }
1587         if ((type == PARAM_TYPE_CB_OBJECT) && (*(uint32_t *)cacheLen >= sizeof(ipcParams[i].idx))) {
1588             *(int32_t *)paramCache = ipcParams[i].idx;
1589         }
1590         break;
1591     }
1592     return ret;
1593 }
1594 
IsCallbackMethod(int32_t methodId)1595 bool IsCallbackMethod(int32_t methodId)
1596 {
1597     if ((methodId == IPC_CALL_ID_REG_CB) || (methodId == IPC_CALL_ID_REG_LISTENER) ||
1598         (methodId == IPC_CALL_ID_GA_PROC_DATA) || (methodId == IPC_CALL_ID_AUTH_DEVICE)) {
1599         return true;
1600     }
1601     return false;
1602 }
1603 
InitIpcDataCache(uint32_t buffSz)1604 IpcIo *InitIpcDataCache(uint32_t buffSz)
1605 {
1606     IpcIo *ioPtr = NULL;
1607     uint8_t *buf = NULL;
1608     uint32_t len;
1609 
1610     if (buffSz == 0) {
1611         LOGE("invalid param");
1612         return NULL;
1613     }
1614     len = sizeof(IpcIo) + buffSz;
1615     ioPtr = (IpcIo *)HcMalloc(len, 0);
1616     if (ioPtr == NULL) {
1617         LOGE("alloc memory failed");
1618         return NULL;
1619     }
1620     buf = (uint8_t *)ioPtr + sizeof(IpcIo);
1621     /* ipcio inited with 4 svc objects */
1622     IpcIoInit(ioPtr, (void *)buf, buffSz, 4);
1623     return ioPtr;
1624 }
1625 
GetIpcIoDataLength(const IpcIo * io)1626 int32_t GetIpcIoDataLength(const IpcIo *io)
1627 {
1628     uintptr_t beginPos;
1629     uintptr_t endPos;
1630 
1631     if (io == NULL) {
1632         return 0;
1633     }
1634     beginPos = (uintptr_t)(io->bufferBase + IpcIoBufferOffset());
1635     endPos = (uintptr_t)(io->bufferCur);
1636     return (endPos <= beginPos) ? 0 : (int32_t)(endPos - beginPos);
1637 }
1638 
ShowIpcSvcInfo(const SvcIdentity * svc)1639 void ShowIpcSvcInfo(const SvcIdentity *svc)
1640 {
1641     LOGI("svc information - handle(%" LOG_PUB "u), token(%" LOG_PUB "u), cookie(%" LOG_PUB "u)", svc->handle,
1642         svc->token, svc->cookie);
1643 }
1644 
InitProxyAdapt(void)1645 int32_t InitProxyAdapt(void)
1646 {
1647     if (g_proxyInstance == NULL) {
1648         g_proxyInstance = (IClientProxy *)GetProxyInstance(DEV_AUTH_SERVICE_NAME);
1649         if (g_proxyInstance == NULL) {
1650             LOGE("get proxy instance failed");
1651             return HC_ERR_IPC_INIT;
1652         }
1653     }
1654 
1655     if (!g_sdkCbStub.registered) {
1656         g_objectStub.func = CbStubOnRemoteRequest;
1657         g_objectStub.args = NULL;
1658         g_objectStub.isRemote = false;
1659         g_sdkCbStub.stubIdentity.handle = IPC_INVALID_HANDLE;
1660         g_sdkCbStub.stubIdentity.token = SERVICE_TYPE_ANONYMOUS;
1661         g_sdkCbStub.stubIdentity.cookie = (uintptr_t)&g_objectStub;
1662 
1663         ShowIpcSvcInfo(&(g_sdkCbStub.stubIdentity));
1664         g_sdkCbStub.registered = true;
1665     }
1666     return HC_SUCCESS;
1667 }
1668 
UnInitProxyAdapt(void)1669 void UnInitProxyAdapt(void)
1670 {
1671     g_proxyInstance = NULL;
1672     g_sdkCbStub.registered = false;
1673     return;
1674 }
1675 
IpcIoBufferOffset(void)1676 int32_t IpcIoBufferOffset(void)
1677 {
1678     int8_t buf[64]; /* 64 buffer size */
1679     IpcIo ioCache;
1680 
1681     IpcIoInit(&ioCache, (void *)buf, sizeof(buf), 0);
1682     if (ioCache.bufferCur <= ioCache.bufferBase) {
1683         return 0;
1684     }
1685     return (int32_t)((uintptr_t)(ioCache.bufferCur) - (uintptr_t)(ioCache.bufferBase));
1686 }
1687 
1688 #ifdef __cplusplus
1689 }
1690 #endif
1691 
1692