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.h"
26 #include "ipc_service.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);
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)g_cbListLock.lock(&g_cbListLock);
111     return;
112 }
113 
UnLockCallbackList(void)114 static void UnLockCallbackList(void)
115 {
116     g_cbListLock.unlock(&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 %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 %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: %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: %s, proxyId %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: %s", appId);
316         return HC_ERROR;
317     }
318     node->requestId = reqId;
319     node->delOnFni = 0;
320     UnLockCallbackList();
321     LOGI("success, appid: %s, requestId: %lld", 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 %lld, type %d, proxy id %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: %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: %lld, type %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 %lld", 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: %lld", 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: %lld, type %d", requestId, type);
749     LockCallbackList();
750     node = GetIpcCallBackByReqId(requestId, type);
751     if (node == NULL) {
752         UnLockCallbackList();
753         LOGE("onSessionKeyReturned hook is null, request id %lld", 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: %lld", 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: %lld, type %d", requestId, type);
796     LockCallbackList();
797     node = GetIpcCallBackByReqId(requestId, type);
798     if (node == NULL) {
799         UnLockCallbackList();
800         LOGE("onFinish hook is null, request id %lld", 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: %lld", 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: %lld, type %d", requestId, type);
849     LockCallbackList();
850     node = GetIpcCallBackByReqId(requestId, type);
851     if (node == NULL) {
852         UnLockCallbackList();
853         LOGE("onError hook is null, request id %lld", 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: %lld", 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: %lld, type %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 %lld", 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: %lld, %s result", requestId, (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 un-initialized");
994         return;
995     }
996     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
997     if (dataParcel == NULL) {
998         UnLockCallbackList();
999         return;
1000     }
1001 
1002     ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1003     if (ret != HC_SUCCESS) {
1004         UnLockCallbackList();
1005         HcFree((void *)dataParcel);
1006         LOGE("IpcGaCbOnRequest, build trans data failed");
1007         return;
1008     }
1009 
1010     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1011         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1012             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1013             if (listener->onGroupCreated == NULL) {
1014                 continue;
1015             }
1016             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_CREATED,
1017                 (uintptr_t)(listener->onGroupCreated), dataParcel, NULL);
1018         }
1019     }
1020     UnLockCallbackList();
1021     HcFree((void *)dataParcel);
1022     return;
1023 }
1024 
IpcOnGroupDeleted(const char * groupInfo)1025 void IpcOnGroupDeleted(const char *groupInfo)
1026 {
1027     int32_t i;
1028     uint32_t ret;
1029     IpcIo *dataParcel = NULL;
1030     DataChangeListener *listener = NULL;
1031 
1032     if (groupInfo == NULL) {
1033         LOGE("IpcOnGroupDeleted, params error");
1034         return;
1035     }
1036 
1037     LockCallbackList();
1038     if (g_ipcCallBackList.ctx == NULL) {
1039         UnLockCallbackList();
1040         LOGE("IpcCallBackList un-initialized");
1041         return;
1042     }
1043     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1044     if (dataParcel == NULL) {
1045         UnLockCallbackList();
1046         return;
1047     }
1048 
1049     ret = EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1050     if (ret != HC_SUCCESS) {
1051         UnLockCallbackList();
1052         HcFree((void *)dataParcel);
1053         LOGE("IpcGaCbOnRequest, build trans data failed");
1054         return;
1055     }
1056 
1057     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1058         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1059             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1060             if (listener->onGroupDeleted == NULL) {
1061                 continue;
1062             }
1063             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_GROUP_DELETED,
1064                 (uintptr_t)(listener->onGroupDeleted), dataParcel, NULL);
1065         }
1066     }
1067     UnLockCallbackList();
1068     HcFree((void *)dataParcel);
1069     return;
1070 }
1071 
IpcOnDeviceBound(const char * peerUdid,const char * groupInfo)1072 void IpcOnDeviceBound(const char *peerUdid, const char *groupInfo)
1073 {
1074     int32_t i;
1075     uint32_t ret;
1076     IpcIo *dataParcel = NULL;
1077     DataChangeListener *listener = NULL;
1078 
1079     if ((peerUdid == NULL) || (groupInfo == NULL)) {
1080         LOGE("params error");
1081         return;
1082     }
1083 
1084     LockCallbackList();
1085     if (g_ipcCallBackList.ctx == NULL) {
1086         UnLockCallbackList();
1087         LOGE("IpcCallBackList un-initialized");
1088         return;
1089     }
1090     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1091     if (dataParcel == NULL) {
1092         UnLockCallbackList();
1093         return;
1094     }
1095 
1096     ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1097     ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1098     if (ret != HC_SUCCESS) {
1099         UnLockCallbackList();
1100         HcFree((void *)dataParcel);
1101         LOGE("build trans data failed");
1102         return;
1103     }
1104 
1105     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1106         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1107             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1108             if (listener->onDeviceBound == NULL) {
1109                 continue;
1110             }
1111             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_BOUND,
1112                 (uintptr_t)(listener->onDeviceBound), dataParcel, NULL);
1113         }
1114     }
1115     UnLockCallbackList();
1116     HcFree((void *)dataParcel);
1117     return;
1118 }
1119 
IpcOnDeviceUnBound(const char * peerUdid,const char * groupInfo)1120 void IpcOnDeviceUnBound(const char *peerUdid, const char *groupInfo)
1121 {
1122     int32_t i;
1123     uint32_t ret;
1124     IpcIo *dataParcel = NULL;
1125     DataChangeListener *listener = NULL;
1126 
1127     if ((peerUdid == NULL) || (groupInfo == NULL)) {
1128         LOGE("params error");
1129         return;
1130     }
1131 
1132     LockCallbackList();
1133     if (g_ipcCallBackList.ctx == NULL) {
1134         UnLockCallbackList();
1135         LOGE("IpcCallBackList un-initialized");
1136         return;
1137     }
1138     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1139     if (dataParcel == NULL) {
1140         UnLockCallbackList();
1141         return;
1142     }
1143 
1144     ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1145     ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_INFO, (const uint8_t *)(groupInfo), HcStrlen(groupInfo) + 1);
1146     if (ret != HC_SUCCESS) {
1147         UnLockCallbackList();
1148         HcFree((void *)dataParcel);
1149         LOGE("build trans data failed");
1150         return;
1151     }
1152 
1153     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1154         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1155             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1156             if (listener->onDeviceUnBound == NULL) {
1157                 continue;
1158             }
1159             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNBOUND,
1160                 (uintptr_t)(listener->onDeviceUnBound), dataParcel, NULL);
1161         }
1162     }
1163     UnLockCallbackList();
1164     HcFree((void *)dataParcel);
1165     return;
1166 }
1167 
IpcOnDeviceNotTrusted(const char * peerUdid)1168 void IpcOnDeviceNotTrusted(const char *peerUdid)
1169 {
1170     int32_t i;
1171     uint32_t ret;
1172     IpcIo *dataParcel = NULL;
1173     DataChangeListener *listener = NULL;
1174 
1175     if (peerUdid == NULL) {
1176         LOGE("params error");
1177         return;
1178     }
1179 
1180     LockCallbackList();
1181     if (g_ipcCallBackList.ctx == NULL) {
1182         UnLockCallbackList();
1183         LOGE("IpcCallBackList un-initialized");
1184         return;
1185     }
1186     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1187     if (dataParcel == NULL) {
1188         UnLockCallbackList();
1189         return;
1190     }
1191 
1192     ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1193     if (ret != HC_SUCCESS) {
1194         UnLockCallbackList();
1195         HcFree((void *)dataParcel);
1196         LOGE("build trans data failed");
1197         return;
1198     }
1199 
1200     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1201         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1202             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1203             if (listener->onDeviceNotTrusted == NULL) {
1204                 continue;
1205             }
1206             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_DEV_UNTRUSTED,
1207                 (uintptr_t)(listener->onDeviceNotTrusted), dataParcel, NULL);
1208         }
1209     }
1210     UnLockCallbackList();
1211     HcFree((void *)dataParcel);
1212     return;
1213 }
1214 
IpcOnLastGroupDeleted(const char * peerUdid,int32_t groupType)1215 void IpcOnLastGroupDeleted(const char *peerUdid, int32_t groupType)
1216 {
1217     int32_t i;
1218     uint32_t ret;
1219     IpcIo *dataParcel = NULL;
1220     DataChangeListener *listener = NULL;
1221 
1222     if (peerUdid == NULL) {
1223         LOGE("params error");
1224         return;
1225     }
1226 
1227     LockCallbackList();
1228     if (g_ipcCallBackList.ctx == NULL) {
1229         UnLockCallbackList();
1230         LOGE("IpcCallBackList un-initialized");
1231         return;
1232     }
1233     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1234     if (dataParcel == NULL) {
1235         UnLockCallbackList();
1236         return;
1237     }
1238 
1239     ret = EncodeCallData(dataParcel, PARAM_TYPE_UDID, (const uint8_t *)(peerUdid), HcStrlen(peerUdid) + 1);
1240     ret |= EncodeCallData(dataParcel, PARAM_TYPE_GROUP_TYPE, (const uint8_t *)(&groupType), sizeof(groupType));
1241     if (ret != HC_SUCCESS) {
1242         UnLockCallbackList();
1243         HcFree((void *)dataParcel);
1244         LOGE("build trans data failed");
1245         return;
1246     }
1247 
1248     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1249         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1250             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1251             if (listener->onLastGroupDeleted == NULL) {
1252                 continue;
1253             }
1254             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_LAST_GROUP_DELETED,
1255                 (uintptr_t)(listener->onLastGroupDeleted), dataParcel, NULL);
1256         }
1257     }
1258     UnLockCallbackList();
1259     HcFree((void *)dataParcel);
1260     return;
1261 }
1262 
IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum)1263 void IpcOnTrustedDeviceNumChanged(int32_t curTrustedDeviceNum)
1264 {
1265     int32_t i;
1266     uint32_t ret;
1267     IpcIo *dataParcel = NULL;
1268     DataChangeListener *listener = NULL;
1269 
1270     LockCallbackList();
1271     if (g_ipcCallBackList.ctx == NULL) {
1272         UnLockCallbackList();
1273         LOGE("IpcCallBackList un-initialized");
1274         return;
1275     }
1276 
1277     dataParcel = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1278     if (dataParcel == NULL) {
1279         UnLockCallbackList();
1280         return;
1281     }
1282     ret = EncodeCallData(dataParcel, PARAM_TYPE_DATA_NUM,
1283         (const uint8_t *)(&curTrustedDeviceNum), sizeof(curTrustedDeviceNum));
1284     if (ret != HC_SUCCESS) {
1285         UnLockCallbackList();
1286         HcFree((void *)dataParcel);
1287         LOGE("IpcOnTrustedDeviceNumChanged, build trans data failed");
1288         return;
1289     }
1290 
1291     for (i = 0; i < IPC_CALL_BACK_MAX_NODES; i++) {
1292         if (g_ipcCallBackList.ctx[i].cbType == CB_TYPE_LISTENER) {
1293             listener = &(g_ipcCallBackList.ctx[i].cbCtx.listener);
1294             if (listener->onTrustedDeviceNumChanged == NULL) {
1295                 continue;
1296             }
1297             ActCallback(g_ipcCallBackList.ctx[i].proxyId, CB_ID_ON_TRUST_DEV_NUM_CHANGED,
1298                 (uintptr_t)(listener->onTrustedDeviceNumChanged), dataParcel, NULL);
1299         }
1300     }
1301     UnLockCallbackList();
1302     HcFree((void *)dataParcel);
1303     return;
1304 }
1305 
InitDeviceAuthCbCtx(DeviceAuthCallback * ctx,int32_t type)1306 void InitDeviceAuthCbCtx(DeviceAuthCallback *ctx, int32_t type)
1307 {
1308     if (ctx == NULL) {
1309         return;
1310     }
1311     if (type == CB_TYPE_DEV_AUTH) {
1312         ctx->onTransmit = IpcGaCbOnTransmit;
1313         ctx->onSessionKeyReturned = IpcGaCbOnSessionKeyReturned;
1314         ctx->onFinish = IpcGaCbOnFinish;
1315         ctx->onError = IpcGaCbOnError;
1316         ctx->onRequest = IpcGaCbOnRequest;
1317     }
1318     if (type == CB_TYPE_TMP_DEV_AUTH) {
1319         ctx->onTransmit = TmpIpcGaCbOnTransmit;
1320         ctx->onSessionKeyReturned = TmpIpcGaCbOnSessionKeyReturned;
1321         ctx->onFinish = TmpIpcGaCbOnFinish;
1322         ctx->onError = TmpIpcGaCbOnError;
1323         ctx->onRequest = TmpIpcGaCbOnRequest;
1324     }
1325     return;
1326 }
1327 
InitDevAuthListenerCbCtx(DataChangeListener * ctx)1328 void InitDevAuthListenerCbCtx(DataChangeListener *ctx)
1329 {
1330     if (ctx == NULL) {
1331         return;
1332     }
1333     ctx->onGroupCreated = IpcOnGroupCreated;
1334     ctx->onGroupDeleted = IpcOnGroupDeleted;
1335     ctx->onDeviceBound = IpcOnDeviceBound;
1336     ctx->onDeviceUnBound = IpcOnDeviceUnBound;
1337     ctx->onDeviceNotTrusted = IpcOnDeviceNotTrusted;
1338     ctx->onLastGroupDeleted = IpcOnLastGroupDeleted;
1339     ctx->onTrustedDeviceNumChanged = IpcOnTrustedDeviceNumChanged;
1340     return;
1341 }
1342 
1343 /* ipc client process adapter */
CreateCallCtx(uintptr_t * callCtx,uintptr_t * cbCtx)1344 int32_t CreateCallCtx(uintptr_t *callCtx, uintptr_t *cbCtx)
1345 {
1346     ProxyDevAuthData *dataCache = NULL;
1347 
1348     (void)cbCtx;
1349     if (callCtx == NULL) {
1350         return HC_ERR_INVALID_PARAMS;
1351     }
1352 
1353     dataCache = (ProxyDevAuthData *)HcMalloc(sizeof(ProxyDevAuthData), 0);
1354     if (dataCache == NULL) {
1355         LOGE("call context alloc failed");
1356         return HC_ERR_ALLOC_MEMORY;
1357     }
1358     dataCache->data = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1359     dataCache->tmpData = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1360     dataCache->reply = InitIpcDataCache(IPC_DATA_BUFF_MAX_SZ);
1361     if ((dataCache->data == NULL) || (dataCache->tmpData == NULL) || (dataCache->reply == NULL)) {
1362         DestroyCallCtx((uintptr_t *)(dataCache), NULL);
1363         return HC_ERROR;
1364     }
1365     /* linux lite, ipc io init with : token + SvcIdentity */
1366     dataCache->ioBuffOffset = IpcIoBufferOffset();
1367     *callCtx = (uintptr_t)(dataCache);
1368     return HC_SUCCESS;
1369 }
1370 
DestroyCallCtx(uintptr_t * callCtx,uintptr_t * cbCtx)1371 void DestroyCallCtx(uintptr_t *callCtx, uintptr_t *cbCtx)
1372 {
1373     ProxyDevAuthData *dataCache = NULL;
1374 
1375     (void)cbCtx;
1376     if ((callCtx != NULL) && (*callCtx != 0)) {
1377         dataCache = (ProxyDevAuthData *)(*callCtx);
1378         if (dataCache->data != NULL) {
1379             HcFree((void *)dataCache->data);
1380             dataCache->data = NULL;
1381         }
1382         if (dataCache->tmpData != NULL) {
1383             HcFree((void *)dataCache->tmpData);
1384             dataCache->tmpData = NULL;
1385         }
1386         if (dataCache->reply != NULL) {
1387             HcFree((void *)dataCache->reply);
1388             dataCache->reply = NULL;
1389         }
1390         HcFree((void *)dataCache);
1391         *callCtx = 0;
1392     }
1393     return;
1394 }
1395 
SetCbCtxToDataCtx(uintptr_t callCtx,int32_t cbIdx)1396 void SetCbCtxToDataCtx(uintptr_t callCtx, int32_t cbIdx)
1397 {
1398     ProxyDevAuthData *dataCache = NULL;
1399     const SvcIdentity *stubInfo = &g_sdkCbStub.stubIdentity;
1400     (void)cbIdx;
1401     if (!g_sdkCbStub.registered) {
1402         LOGW("SDK callback stub un-registered");
1403         return;
1404     }
1405     ShowIpcSvcInfo(stubInfo);
1406     dataCache = (ProxyDevAuthData *)(callCtx);
1407     SetCallbackStub(dataCache, stubInfo);
1408     return;
1409 }
1410 
SetCallRequestParamInfo(uintptr_t callCtx,int32_t type,const uint8_t * param,int32_t paramSz)1411 int32_t SetCallRequestParamInfo(uintptr_t callCtx, int32_t type, const uint8_t *param, int32_t paramSz)
1412 {
1413     ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1414 
1415     return EncodeCallRequest(dataCache, type, param, paramSz);
1416 }
1417 
DoBinderCall(uintptr_t callCtx,int32_t methodId,bool withSync)1418 int32_t DoBinderCall(uintptr_t callCtx, int32_t methodId, bool withSync)
1419 {
1420     (void)withSync;
1421     int32_t ret;
1422     ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1423 
1424     ret = FinalCallRequest(dataCache, methodId);
1425     if (ret != HC_SUCCESS) {
1426         return ret;
1427     }
1428     return ActCall(g_proxyInstance, dataCache);
1429 }
1430 
1431 /* ipc service process adapter */
SetIpcCallMap(uintptr_t ipcInstance,IpcServiceCall method,int32_t methodId)1432 uint32_t SetIpcCallMap(uintptr_t ipcInstance, IpcServiceCall method, int32_t methodId)
1433 {
1434     (void)ipcInstance;
1435     if ((method == NULL) || (methodId <= 0)) {
1436         return HC_ERR_INVALID_PARAMS;
1437     }
1438 
1439     return (uint32_t)SetCallMap(method, methodId);
1440 }
1441 
CreateServiceInstance(uintptr_t * ipcInstance)1442 int32_t CreateServiceInstance(uintptr_t *ipcInstance)
1443 {
1444     *ipcInstance = 0x0;
1445     return HC_SUCCESS;
1446 }
1447 
DestroyServiceInstance(uintptr_t ipcInstance)1448 void DestroyServiceInstance(uintptr_t ipcInstance)
1449 {
1450     (void)ipcInstance;
1451 }
1452 
AddDevAuthServiceToManager(uintptr_t serviceInstance)1453 int32_t AddDevAuthServiceToManager(uintptr_t serviceInstance)
1454 {
1455     (void)serviceInstance;
1456     SAMGR_Bootstrap();
1457     InitCbStubTable();
1458     LOGI("AddSystemAbility to SA manager success");
1459     return HC_SUCCESS;
1460 }
1461 
IpcEncodeCallReply(uintptr_t replayCache,int32_t type,const uint8_t * result,int32_t resultSz)1462 int32_t IpcEncodeCallReply(uintptr_t replayCache, int32_t type, const uint8_t *result, int32_t resultSz)
1463 {
1464     int32_t ret = HC_SUCCESS;
1465     IpcIo *replyParcel = NULL;
1466     unsigned long valZero = 0uL;
1467 
1468     replyParcel = (IpcIo *)(replayCache);
1469     WriteInt32(replyParcel, type);
1470     bool value;
1471     if ((result != NULL) && (resultSz > 0)) {
1472         WriteUint32(replyParcel, (uint32_t)resultSz);
1473         value = WriteBuffer(replyParcel, (const void *)result, (uint32_t)resultSz);
1474     } else {
1475         WriteUint32(replyParcel, sizeof(valZero));
1476         value = WriteBuffer(replyParcel, (const void *)(&valZero), sizeof(valZero));
1477     }
1478     if (!value) {
1479         LOGE("encode call reply fail.");
1480         return HC_FALSE;
1481     }
1482     return ret;
1483 }
1484 
DecodeIpcData(uintptr_t data,int32_t * type,uint8_t ** val,int32_t * valSz)1485 int32_t DecodeIpcData(uintptr_t data, int32_t *type, uint8_t **val, int32_t *valSz)
1486 {
1487     IpcIo *dataPtr = NULL;
1488 
1489     dataPtr = (IpcIo *)(data);
1490     if (dataPtr->bufferLeft <= 0) {
1491         return HC_SUCCESS;
1492     }
1493     ReadInt32(dataPtr, type);
1494     ReadUint32(dataPtr, (uint32_t *)valSz);
1495     *val = (uint8_t *)ReadBuffer(dataPtr, *valSz);
1496     return HC_SUCCESS;
1497 }
1498 
DecodeCallReply(uintptr_t callCtx,IpcDataInfo * replyCache,int32_t cacheNum)1499 void DecodeCallReply(uintptr_t callCtx, IpcDataInfo *replyCache, int32_t cacheNum)
1500 {
1501     int32_t i;
1502     int32_t ret;
1503     uint32_t replyLen;
1504 
1505     ProxyDevAuthData *dataCache = (ProxyDevAuthData *)(callCtx);
1506     ReadUint32(dataCache->reply, &replyLen);
1507     if (replyLen == 0) {
1508         return;
1509     }
1510 
1511     for (i = 0; i < cacheNum; i++) {
1512         ret = DecodeIpcData((uintptr_t)(dataCache->reply),
1513             &(replyCache[i].type), &(replyCache[i].val), &(replyCache[i].valSz));
1514         if (ret != HC_SUCCESS) {
1515             return;
1516         }
1517     }
1518     return;
1519 }
1520 
IsTypeForSettingPtr(int32_t type)1521 static bool IsTypeForSettingPtr(int32_t type)
1522 {
1523     int32_t typeList[] = {
1524         PARAM_TYPE_APPID, PARAM_TYPE_DEV_AUTH_CB, PARAM_TYPE_LISTERNER, PARAM_TYPE_CREATE_PARAMS,
1525         PARAM_TYPE_GROUPID, PARAM_TYPE_UDID, PARAM_TYPE_ADD_PARAMS, PARAM_TYPE_DEL_PARAMS,
1526         PARAM_TYPE_QUERY_PARAMS, PARAM_TYPE_COMM_DATA, PARAM_TYPE_SESS_KEY,
1527         PARAM_TYPE_REQ_INFO, PARAM_TYPE_GROUP_INFO, PARAM_TYPE_AUTH_PARAMS, PARAM_TYPE_REQ_JSON,
1528         PARAM_TYPE_PSEUDONYM_ID, PARAM_TYPE_INDEX_KEY, PARAM_TYPE_ERR_INFO
1529     };
1530     int32_t i;
1531     int32_t n = sizeof(typeList) / sizeof(typeList[0]);
1532     for (i = 0; i < n; i++) {
1533         if (typeList[i] == type) {
1534             return true;
1535         }
1536     }
1537     return false;
1538 }
1539 
IsTypeForCpyData(int32_t type)1540 static bool IsTypeForCpyData(int32_t type)
1541 {
1542     int32_t typeList[] = {
1543         PARAM_TYPE_REQID, PARAM_TYPE_GROUP_TYPE, PARAM_TYPE_OPCODE, PARAM_TYPE_ERRCODE, PARAM_TYPE_OS_ACCOUNT_ID
1544     };
1545     int32_t i;
1546     int32_t n = sizeof(typeList) / sizeof(typeList[0]);
1547     for (i = 0; i < n; i++) {
1548         if (typeList[i] == type) {
1549             return true;
1550         }
1551     }
1552     return false;
1553 }
1554 
GetIpcRequestParamByType(const IpcDataInfo * ipcParams,int32_t paramNum,int32_t type,uint8_t * paramCache,int32_t * cacheLen)1555 int32_t GetIpcRequestParamByType(const IpcDataInfo *ipcParams, int32_t paramNum,
1556     int32_t type, uint8_t *paramCache, int32_t *cacheLen)
1557 {
1558     int32_t i;
1559     int32_t ret = HC_ERR_IPC_BAD_MSG_TYPE;
1560     errno_t eno;
1561 
1562     for (i = 0; i < paramNum; i++) {
1563         if (ipcParams[i].type != type) {
1564             continue;
1565         }
1566         ret = HC_SUCCESS;
1567         if (IsTypeForSettingPtr(type)) {
1568             *(uint8_t **)paramCache = ipcParams[i].val;
1569             if (cacheLen != NULL) {
1570                 *cacheLen = ipcParams[i].valSz;
1571             }
1572             break;
1573         }
1574         if (IsTypeForCpyData(type)) {
1575             if ((ipcParams[i].val == NULL) || (ipcParams[i].valSz <= 0)) {
1576                 ret = HC_ERR_INVALID_PARAMS;
1577                 break;
1578             }
1579             eno = memcpy_s(paramCache, *cacheLen, ipcParams[i].val, ipcParams[i].valSz);
1580             if (eno != EOK) {
1581                 ret = HC_ERR_MEMORY_COPY;
1582             }
1583             *cacheLen = ipcParams[i].valSz;
1584             break;
1585         }
1586         if ((type == PARAM_TYPE_CB_OBJECT) && (*(uint32_t *)cacheLen >= sizeof(ipcParams[i].idx))) {
1587             *(int32_t *)paramCache = ipcParams[i].idx;
1588         }
1589         break;
1590     }
1591     return ret;
1592 }
1593 
IsCallbackMethod(int32_t methodId)1594 bool IsCallbackMethod(int32_t methodId)
1595 {
1596     if ((methodId == IPC_CALL_ID_REG_CB) || (methodId == IPC_CALL_ID_REG_LISTENER) ||
1597         (methodId == IPC_CALL_ID_GA_PROC_DATA) || (methodId == IPC_CALL_ID_AUTH_DEVICE)) {
1598         return true;
1599     }
1600     return false;
1601 }
1602 
InitIpcDataCache(uint32_t buffSz)1603 IpcIo *InitIpcDataCache(uint32_t buffSz)
1604 {
1605     IpcIo *ioPtr = NULL;
1606     uint8_t *buf = NULL;
1607     uint32_t len;
1608 
1609     if (buffSz == 0) {
1610         LOGE("invalid param");
1611         return NULL;
1612     }
1613     len = sizeof(IpcIo) + buffSz;
1614     ioPtr = (IpcIo *)HcMalloc(len, 0);
1615     if (ioPtr == NULL) {
1616         LOGE("alloc memory failed");
1617         return NULL;
1618     }
1619     buf = (uint8_t *)ioPtr + sizeof(IpcIo);
1620     /* ipcio inited with 4 svc objects */
1621     IpcIoInit(ioPtr, (void *)buf, buffSz, 4);
1622     return ioPtr;
1623 }
1624 
GetIpcIoDataLength(const IpcIo * io)1625 int32_t GetIpcIoDataLength(const IpcIo *io)
1626 {
1627     uintptr_t beginPos;
1628     uintptr_t endPos;
1629 
1630     if (io == NULL) {
1631         return 0;
1632     }
1633     beginPos = (uintptr_t)(io->bufferBase + IpcIoBufferOffset());
1634     endPos = (uintptr_t)(io->bufferCur);
1635     return (endPos <= beginPos) ? 0 : (int32_t)(endPos - beginPos);
1636 }
1637 
ShowIpcSvcInfo(const SvcIdentity * svc)1638 void ShowIpcSvcInfo(const SvcIdentity *svc)
1639 {
1640     LOGI("svc information - handle(%u), token(%u), cookie(%u)",
1641         svc->handle, svc->token, svc->cookie);
1642 }
1643 
InitProxyAdapt(void)1644 int32_t InitProxyAdapt(void)
1645 {
1646     if (g_proxyInstance == NULL) {
1647         g_proxyInstance = (IClientProxy *)GetProxyInstance(DEV_AUTH_SERVICE_NAME);
1648         if (g_proxyInstance == NULL) {
1649             LOGE("get proxy instance failed");
1650             return HC_ERR_IPC_INIT;
1651         }
1652     }
1653 
1654     if (!g_sdkCbStub.registered) {
1655         g_objectStub.func = CbStubOnRemoteRequest;
1656         g_objectStub.args = NULL;
1657         g_objectStub.isRemote = false;
1658         g_sdkCbStub.stubIdentity.handle = IPC_INVALID_HANDLE;
1659         g_sdkCbStub.stubIdentity.token = SERVICE_TYPE_ANONYMOUS;
1660         g_sdkCbStub.stubIdentity.cookie = (uintptr_t)&g_objectStub;
1661 
1662         ShowIpcSvcInfo(&(g_sdkCbStub.stubIdentity));
1663         g_sdkCbStub.registered = true;
1664     }
1665     return HC_SUCCESS;
1666 }
1667 
UnInitProxyAdapt(void)1668 void UnInitProxyAdapt(void)
1669 {
1670     g_proxyInstance = NULL;
1671     g_sdkCbStub.registered = false;
1672     return;
1673 }
1674 
IpcIoBufferOffset(void)1675 int32_t IpcIoBufferOffset(void)
1676 {
1677     int8_t buf[64]; /* 64 buffer size */
1678     IpcIo ioCache;
1679 
1680     IpcIoInit(&ioCache, (void *)buf, sizeof(buf), 0);
1681     if (ioCache.bufferCur <= ioCache.bufferBase) {
1682         return 0;
1683     }
1684     return (int32_t)((uintptr_t)(ioCache.bufferCur) - (uintptr_t)(ioCache.bufferBase));
1685 }
1686 
1687 #ifdef __cplusplus
1688 }
1689 #endif
1690 
1691