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