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