1 /*
2 * Copyright (C) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "identity_service_impl.h"
17
18 #include "alg_defs.h"
19 #include "alg_loader.h"
20 #include "clib_error.h"
21 #include "common_defs.h"
22 #include "credential_data_manager.h"
23 #include "device_auth.h"
24 #include "device_auth_defines.h"
25 #include "hal_error.h"
26 #include "hc_log.h"
27
28 #include "identity_operation.h"
29 #include "identity_service_defines.h"
30
AddCredentialImplInner(int32_t osAccountId,CJson * reqJson,Credential * credential,char ** returnData)31 static int32_t AddCredentialImplInner(int32_t osAccountId, CJson *reqJson, Credential *credential,
32 char **returnData)
33 {
34 uint8_t method = DEFAULT_VAL;
35 Uint8Buff keyValue = { NULL, 0 };
36 int32_t ret = CheckAndSetCredInfo(osAccountId, credential, reqJson, &method, &keyValue);
37 if (ret != IS_SUCCESS) {
38 return ret;
39 }
40 Uint8Buff credIdByte = { NULL, 0 };
41 if ((ret = GenerateCredId(osAccountId, credential, &credIdByte)) != IS_SUCCESS) {
42 HcFree(keyValue.val);
43 return ret;
44 }
45 if ((ret = AddKeyValueToHuks(osAccountId, &credIdByte, credential, method, &keyValue)) != IS_SUCCESS) {
46 HcFree(keyValue.val);
47 HcFree(credIdByte.val);
48 return ret;
49 }
50 HcFree(keyValue.val);
51 if ((ret = AddCredAndSaveDb(osAccountId, credential)) != IS_SUCCESS) {
52 if (GetLoaderInstance()->deleteKey(&credIdByte, false, osAccountId) != IS_SUCCESS) {
53 LOGE("Failed to delete key from HUKS");
54 }
55 HcFree(credIdByte.val);
56 return ret;
57 }
58 HcFree(credIdByte.val);
59 if (DeepCopyString(StringGet(&credential->credId), returnData) != EOK) {
60 LOGE("Failed to return credId");
61 return IS_ERR_MEMORY_COPY;
62 }
63 return IS_SUCCESS;
64 }
65
AddCredentialImpl(int32_t osAccountId,const char * requestParams,char ** returnData)66 int32_t AddCredentialImpl(int32_t osAccountId, const char *requestParams, char **returnData)
67 {
68 CJson *reqJson = CreateJsonFromString(requestParams);
69 if (reqJson == NULL) {
70 LOGE("Failed to create reqJson from string!");
71 return IS_ERR_JSON_CREATE;
72 }
73 Credential *credential = CreateCredential();
74 if (credential == NULL) {
75 LOGE("Failed to malloc Credential");
76 FreeJson(reqJson);
77 return IS_ERR_ALLOC_MEMORY;
78 }
79 int32_t ret = AddCredentialImplInner(osAccountId, reqJson, credential, returnData);
80 FreeJson(reqJson);
81 DestroyCredential(credential);
82 return ret;
83 }
84
ExportCredentialImpl(int32_t osAccountId,const char * credId,char ** returnData)85 int32_t ExportCredentialImpl(int32_t osAccountId, const char *credId, char **returnData)
86 {
87 Credential *credential = NULL;
88 int32_t ret = GetCredentialById(osAccountId, credId, &credential);
89 if (ret != IS_SUCCESS) {
90 return ret;
91 }
92 DestroyCredential(credential);
93
94 Uint8Buff credIdByte = { NULL, 0 };
95
96 ret = GetValidKeyAlias(osAccountId, credId, &credIdByte);
97 if (ret == HAL_ERR_KEY_NOT_EXIST) {
98 LOGE("Huks key not exist!");
99 DelCredById(osAccountId, credId);
100 return IS_ERR_HUKS_KEY_NOT_EXIST;
101 }
102 if (ret == HAL_ERR_HUKS) {
103 LOGE("Huks check key exist failed");
104 return IS_ERR_HUKS_CHECK_KEY_EXIST_FAILED;
105 }
106 if (ret != IS_SUCCESS) {
107 LOGE("Failed to check key exist in HUKS");
108 return ret;
109 }
110
111 KeyParams keyParams = { { credIdByte.val, credIdByte.length, true }, false, osAccountId };
112 uint8_t pubKeyVal[KEY_VALUE_MAX_LENGTH] = { 0 };
113 Uint8Buff keyValue = { pubKeyVal, KEY_VALUE_MAX_LENGTH };
114 ret = GetLoaderInstance()->exportPublicKey(&keyParams, &keyValue);
115 HcFree(credIdByte.val);
116 if (ret == HAL_ERR_HUKS) {
117 LOGE("Huks export key failed!");
118 return IS_ERR_HUKS_EXPORT_KEY_FAILED;
119 }
120 if (ret != IS_SUCCESS) {
121 LOGE("Failed to export key");
122 return ret;
123 }
124
125 ret = AddKeyValueToReturn(keyValue, returnData);
126 if (ret != IS_SUCCESS) {
127 return ret;
128 }
129 return IS_SUCCESS;
130 }
131
QueryCredentialByParamsImpl(int32_t osAccountId,const char * requestParams,char ** returnData)132 int32_t QueryCredentialByParamsImpl(int32_t osAccountId, const char *requestParams, char **returnData)
133 {
134 CJson *reqJson = CreateJsonFromString(requestParams);
135 if (reqJson == NULL) {
136 LOGE("Failed to create reqJson from string!");
137 return IS_ERR_JSON_CREATE;
138 }
139
140 QueryCredentialParams queryParams = InitQueryCredentialParams();
141 SetQueryParamsFromJson(&queryParams, reqJson);
142
143 CredentialVec credentialVec = CreateCredentialVec();
144
145 int32_t ret = QueryCredentials(osAccountId, &queryParams, &credentialVec);
146 if (ret != IS_SUCCESS) {
147 LOGE("Failed to query credentials");
148 FreeJson(reqJson);
149 ClearCredentialVec(&credentialVec);
150 return ret;
151 }
152 if (credentialVec.size(&credentialVec) == 0) {
153 LOGW("No credential found");
154 FreeJson(reqJson);
155 ClearCredentialVec(&credentialVec);
156 return GenerateReturnEmptyArrayStr(returnData);
157 }
158
159 CJson *credIdJson = CreateJsonArray();
160 if (credIdJson == NULL) {
161 LOGE("Failed to create credIdJson object");
162 FreeJson(reqJson);
163 ClearCredentialVec(&credentialVec);
164 return IS_ERR_JSON_CREATE;
165 }
166
167 ret = GetCredIdsFromCredVec(osAccountId, reqJson, &credentialVec, credIdJson);
168 FreeJson(reqJson);
169 ClearCredentialVec(&credentialVec);
170 if (ret != IS_SUCCESS) {
171 FreeJson(credIdJson);
172 return ret;
173 }
174
175 *returnData = PackJsonToString(credIdJson);
176 FreeJson(credIdJson);
177 if (*returnData == NULL) {
178 LOGE("Failed to pack json to string");
179 return IS_ERR_PACKAGE_JSON_TO_STRING_FAIL;
180 }
181
182 return IS_SUCCESS;
183 }
184
QueryCredInfoByCredIdImpl(int32_t osAccountId,const char * credId,char ** returnData)185 int32_t QueryCredInfoByCredIdImpl(int32_t osAccountId, const char *credId, char **returnData)
186 {
187 Credential *credential = NULL;
188 int32_t ret = GetCredentialById(osAccountId, credId, &credential);
189 if (ret != IS_SUCCESS) {
190 LOGE("Failed to get credential by credId, ret = %" LOG_PUB "d", ret);
191 return ret;
192 }
193
194 CJson *credInfoJson = CreateJson();
195 if (credInfoJson == NULL) {
196 LOGE("Failed to create credInfoJson object");
197 DestroyCredential(credential);
198 return IS_ERR_JSON_CREATE;
199 }
200
201 ret = GenerateReturnCredInfo(credential, credInfoJson);
202 DestroyCredential(credential);
203 if (ret != IS_SUCCESS) {
204 LOGE("Failed to generate return credential info");
205 FreeJson(credInfoJson);
206 return ret;
207 }
208
209 *returnData = PackJsonToString(credInfoJson);
210 FreeJson(credInfoJson);
211 if (*returnData == NULL) {
212 LOGE("Failed to pack json to string");
213 return IS_ERR_PACKAGE_JSON_TO_STRING_FAIL;
214 }
215
216 return IS_SUCCESS;
217 }
218
DeleteCredentialImpl(int32_t osAccountId,const char * credId)219 int32_t DeleteCredentialImpl(int32_t osAccountId, const char *credId)
220 {
221 Credential *credential = NULL;
222 int32_t ret = GetCredentialById(osAccountId, credId, &credential);
223 if (ret != IS_SUCCESS) {
224 LOGE("Failed to get credential by credId, ret = %" LOG_PUB "d", ret);
225 return ret;
226 }
227 ret = CheckOwnerUidPermission(credential);
228 DestroyCredential(credential);
229 if (ret != IS_SUCCESS) {
230 return ret;
231 }
232
233 uint32_t credIdByteLen = HcStrlen(credId) / BYTE_TO_HEX_OPER_LENGTH;
234 Uint8Buff credIdByte = { NULL, credIdByteLen };
235 credIdByte.val = (uint8_t *)HcMalloc(credIdByteLen, 0);
236 if (credIdByte.val == NULL) {
237 LOGE("Failed to malloc credIdByte");
238 return IS_ERR_ALLOC_MEMORY;
239 }
240
241 ret = HexStringToByte(credId, credIdByte.val, credIdByte.length);
242 if (ret != IS_SUCCESS) {
243 LOGE("Failed to convert credId to byte, invalid credId, ret: %" LOG_PUB "d", ret);
244 HcFree(credIdByte.val);
245 return IS_ERR_INVALID_HEX_STRING;
246 }
247
248 ret = GetLoaderInstance()->deleteKey(&credIdByte, false, osAccountId);
249 HcFree(credIdByte.val);
250 if (ret == HAL_ERR_HUKS) {
251 LOGW("Huks delete key failed, error: %" LOG_PUB "d, continue to delete local cred", IS_ERR_HUKS_DELETE_FAILED);
252 }
253
254 ret = DelCredById(osAccountId, credId);
255 if (ret != IS_SUCCESS) {
256 LOGE("Failed to delete local credential");
257 return ret;
258 }
259 LOGI("Delete credential success");
260 return IS_SUCCESS;
261 }
262
DelCredsWithHash(int32_t osAccountId,CJson * reqJson,CredentialVec * credentialVec,CJson * credIdJson)263 static int32_t DelCredsWithHash(int32_t osAccountId, CJson *reqJson, CredentialVec *credentialVec, CJson *credIdJson)
264 {
265 Credential **ptr;
266 uint32_t index;
267 int32_t ret = IS_SUCCESS;
268 FOR_EACH_HC_VECTOR(*credentialVec, index, ptr) {
269 if (*ptr == NULL) {
270 continue;
271 }
272 Credential *credential = (Credential *)(*ptr);
273 const char *credId = StringGet(&credential->credId);
274 if (credId == NULL) {
275 LOGE("Failed to get credId");
276 continue;
277 }
278
279 if (!IsCredHashMatch(credential, reqJson)) {
280 continue;
281 }
282
283 ret = AddStringToArray(credIdJson, credId);
284 if (ret != IS_SUCCESS) {
285 LOGE("Failed to add credId to json");
286 return IS_ERR_JSON_ADD;
287 }
288 ret = DeleteCredentialImpl(osAccountId, credId);
289 }
290 return ret;
291 }
292
DeleteCredByParamsImpl(int32_t osAccountId,const char * requestParams,char ** returnData)293 int32_t DeleteCredByParamsImpl(int32_t osAccountId, const char *requestParams, char **returnData)
294 {
295 CJson *reqJson = CreateJsonFromString(requestParams);
296 if (reqJson == NULL) {
297 LOGE("Failed to create reqJson from string!");
298 return IS_ERR_JSON_CREATE;
299 }
300 QueryCredentialParams delParams = InitQueryCredentialParams();
301 SetQueryParamsFromJson(&delParams, reqJson);
302 CredentialVec credentialVec = CreateCredentialVec();
303
304 int32_t ret = QueryCredentials(osAccountId, &delParams, &credentialVec);
305 if (ret != IS_SUCCESS) {
306 LOGE("Failed to query credentials");
307 FreeJson(reqJson);
308 ClearCredentialVec(&credentialVec);
309 return ret;
310 }
311 CJson *credIdJson = CreateJsonArray();
312 if (credIdJson == NULL) {
313 LOGE("Failed to create credIdJson");
314 FreeJson(reqJson);
315 ClearCredentialVec(&credentialVec);
316 return IS_ERR_JSON_CREATE;
317 }
318 ret = DelCredsWithHash(osAccountId, reqJson, &credentialVec, credIdJson);
319 FreeJson(reqJson);
320 ClearCredentialVec(&credentialVec);
321 if (ret != IS_SUCCESS) {
322 LOGE("Failed to get and delete credential in vec");
323 FreeJson(credIdJson);
324 return ret;
325 }
326 *returnData = PackJsonToString(credIdJson);
327 FreeJson(credIdJson);
328 if (*returnData == NULL) {
329 LOGE("Failed to pack json to string");
330 return IS_ERR_PACKAGE_JSON_TO_STRING_FAIL;
331 }
332 return ret;
333 }
334
UpdateCredInfoImpl(int32_t osAccountId,const char * credId,const char * requestParams)335 int32_t UpdateCredInfoImpl(int32_t osAccountId, const char *credId, const char *requestParams)
336 {
337 Credential *credential = NULL;
338 int32_t ret = GetCredentialById(osAccountId, credId, &credential);
339 if (ret != IS_SUCCESS) {
340 LOGE("Failed to get credential by credId, ret: %" LOG_PUB "d", ret);
341 return ret;
342 }
343
344 ret = CheckOwnerUidPermission(credential);
345 if (ret != IS_SUCCESS) {
346 DestroyCredential(credential);
347 return ret;
348 }
349
350 CJson *reqJson = CreateJsonFromString(requestParams);
351 if (reqJson == NULL) {
352 LOGE("Failed to create reqJson from string!");
353 DestroyCredential(credential);
354 return IS_ERR_JSON_CREATE;
355 }
356 ret = UpdateInfoFromJson(credential, reqJson);
357 FreeJson(reqJson);
358 if (ret != IS_SUCCESS) {
359 LOGE("Failed to set update info");
360 DestroyCredential(credential);
361 return ret;
362 }
363
364 ret = AddCredAndSaveDb(osAccountId, credential);
365 DestroyCredential(credential);
366 if (ret != IS_SUCCESS) {
367 LOGE("Failed to add credential to db");
368 return ret;
369 }
370
371 return IS_SUCCESS;
372 }
373
AddUpdateCred(int32_t osAccountId,CJson * baseInfoJson,QueryCredentialParams * queryParams)374 static int32_t AddUpdateCred(int32_t osAccountId, CJson *baseInfoJson, QueryCredentialParams *queryParams)
375 {
376 int32_t ret = AddUpdateInfoToJson(queryParams, baseInfoJson);
377 if (ret != IS_SUCCESS) {
378 LOGE("Failed to add update info to json");
379 return ret;
380 }
381 char *addCredReq = PackJsonToString(baseInfoJson);
382 if (addCredReq == NULL) {
383 LOGE("Failed to pack baseInfoJson to addCredReq");
384 return IS_ERR_PACKAGE_JSON_TO_STRING_FAIL;
385 }
386 char *addRetStr = NULL;
387 ret = AddCredentialImpl(osAccountId, addCredReq, &addRetStr);
388 HcFree(addCredReq);
389 HcFree(addRetStr);
390 return ret;
391 }
392
DelCredInVec(int32_t osAccountId,CredentialVec * credVec)393 static int32_t DelCredInVec(int32_t osAccountId, CredentialVec *credVec)
394 {
395 uint32_t index;
396 Credential **ptr;
397 int32_t ret = IS_SUCCESS;
398 FOR_EACH_HC_VECTOR(*credVec, index, ptr) {
399 if (*ptr == NULL) {
400 continue;
401 }
402 Credential *credential = (Credential *)(*ptr);
403 const char *credId = StringGet(&credential->credId);
404 if (credId == NULL) {
405 continue;
406 }
407 ret = DeleteCredentialImpl(osAccountId, credId);
408 if (ret != IS_SUCCESS) {
409 LOGE("Failed to delete credential, ret = %" LOG_PUB "d", ret);
410 return ret;
411 }
412 }
413 return IS_SUCCESS;
414 }
415
ProcessAbnormalCreds(int32_t osAccountId,CJson * baseInfoJson,QueryCredentialParams * queryParams)416 static int32_t ProcessAbnormalCreds(int32_t osAccountId, CJson *baseInfoJson, QueryCredentialParams *queryParams)
417 {
418 int32_t ret = DelCredential(osAccountId, queryParams);
419 if (ret != IS_SUCCESS) {
420 LOGE("Failed to delete abnormal credentials, ret = %" LOG_PUB "d", ret);
421 return ret;
422 }
423 return AddUpdateCred(osAccountId, baseInfoJson, queryParams);
424 }
425
HandleUpdateCredsBySize(int32_t osAccountId,CJson * baseInfoJson,QueryCredentialParams * queryParams,CredentialVec * updateCredVec,CredentialVec * selfCredVec)426 static int32_t HandleUpdateCredsBySize(int32_t osAccountId, CJson *baseInfoJson,
427 QueryCredentialParams *queryParams, CredentialVec *updateCredVec, CredentialVec *selfCredVec)
428 {
429 int32_t ret = IS_ERROR;
430 uint32_t updateMatchSize = updateCredVec->size(updateCredVec);
431 switch (updateMatchSize) {
432 case UPDATE_MATCHED_NUM_ZERO:
433 ret = AddUpdateCred(osAccountId, baseInfoJson, queryParams); // == 0 need add
434 break;
435 case UPDATE_MATCHED_NUM_ONE:
436 ret = EraseUpdateCredIdInSelfVec(updateCredVec, selfCredVec); // update info exists in self vec
437 break;
438 default:
439 ret = ProcessAbnormalCreds(osAccountId, baseInfoJson, queryParams); // > 1 need del old
440 break;
441 }
442 return ret;
443 }
444
ProcessUpdateInfo(int32_t osAccountId,CJson * updateInfoList,CJson * baseInfoJson,QueryCredentialParams * queryParams,CredentialVec * selfCredVec)445 static int32_t ProcessUpdateInfo(int32_t osAccountId, CJson *updateInfoList,
446 CJson *baseInfoJson, QueryCredentialParams *queryParams, CredentialVec *selfCredVec)
447 {
448 int32_t ret = IS_SUCCESS;
449 int32_t updateInfoNum = GetItemNum(updateInfoList);
450 for (int32_t i = 0; i < updateInfoNum; i++) {
451 CJson *item = GetItemFromArray(updateInfoList, i); // shallow copy
452 if (item == NULL) {
453 LOGE("updateInfoList item is NULL");
454 return IS_ERR_JSON_GET;
455 }
456 CredentialVec updateCredVec = CreateCredentialVec();
457 ret = GetUpdateCredVec(osAccountId, item, queryParams, &updateCredVec);
458 if (ret != IS_SUCCESS) {
459 ClearCredentialVec(&updateCredVec);
460 return ret;
461 }
462 ret = HandleUpdateCredsBySize(osAccountId, baseInfoJson, queryParams, &updateCredVec, selfCredVec);
463 ClearCredentialVec(&updateCredVec);
464 if (ret != IS_SUCCESS) {
465 return ret;
466 }
467 }
468 return ret;
469 }
470
GetCurrentCredIds(int32_t osAccountId,CJson * baseInfoJson,char ** returnData)471 static int32_t GetCurrentCredIds(int32_t osAccountId, CJson *baseInfoJson, char **returnData)
472 {
473 char *queryStr = NULL;
474 int32_t ret = GetQueryJsonStr(baseInfoJson, &queryStr);
475 if (ret != IS_SUCCESS) {
476 return ret;
477 }
478 ret = QueryCredentialByParamsImpl(osAccountId, queryStr, returnData);
479 HcFree(queryStr);
480 return ret;
481 }
482
BatchUpdateCredsImplInner(int32_t osAccountId,CJson * baseInfoJson,CJson * updateInfoList,char ** returnData)483 static int32_t BatchUpdateCredsImplInner(int32_t osAccountId,
484 CJson *baseInfoJson, CJson *updateInfoList, char **returnData)
485 {
486 QueryCredentialParams queryParams = InitQueryCredentialParams();
487 int32_t ret = SetRequiredParamsFromJson(&queryParams, baseInfoJson);
488 if (ret != IS_SUCCESS) {
489 return ret;
490 }
491
492 CredentialVec selfCredVec = CreateCredentialVec();
493 ret = QueryCredentials(osAccountId, &queryParams, &selfCredVec);
494 if (ret != IS_SUCCESS) {
495 ClearCredentialVec(&selfCredVec);
496 return ret;
497 }
498
499 ret = ProcessUpdateInfo(osAccountId, updateInfoList, baseInfoJson, &queryParams, &selfCredVec);
500 if (ret != IS_SUCCESS) {
501 ClearCredentialVec(&selfCredVec);
502 return ret;
503 }
504
505 ret = DelCredInVec(osAccountId, &selfCredVec);
506 ClearCredentialVec(&selfCredVec);
507 if (ret != IS_SUCCESS) {
508 return ret;
509 }
510 return GetCurrentCredIds(osAccountId, baseInfoJson, returnData);
511 }
512
BatchUpdateCredsImpl(int32_t osAccountId,const char * requestParams,char ** returnData)513 int32_t BatchUpdateCredsImpl(int32_t osAccountId, const char *requestParams, char **returnData)
514 {
515 CJson *reqJson = CreateJsonFromString(requestParams);
516 if (reqJson == NULL) {
517 LOGE("Failed to create reqJson from string!");
518 return IS_ERR_JSON_CREATE;
519 }
520 CJson *baseInfoJson = GetObjFromJson(reqJson, FIELD_BASE_INFO);
521 CJson *updateInfoList = GetObjFromJson(reqJson, FIELD_UPDATE_LISTS);
522 if (baseInfoJson == NULL || updateInfoList == NULL) {
523 LOGE("baseInfoJson or updateLists is NULL");
524 FreeJson(reqJson);
525 return IS_ERR_INVALID_PARAMS;
526 }
527 int32_t ret = BatchUpdateCredsImplInner(osAccountId, baseInfoJson, updateInfoList, returnData);
528 FreeJson(reqJson);
529 return ret;
530 }
531
AgreeCredentialImplInner(int32_t osAccountId,const char * selfCredId,CJson * reqJson,Credential * agreeCredential,char ** returnData)532 static int32_t AgreeCredentialImplInner(int32_t osAccountId, const char *selfCredId,
533 CJson *reqJson, Credential *agreeCredential, char **returnData)
534 {
535 Uint8Buff keyValue = { NULL, 0 };
536 Uint8Buff agreeCredIdByte = { NULL, 0 };
537 int32_t ret = SetAgreeCredInfo(osAccountId, reqJson, agreeCredential, &keyValue, &agreeCredIdByte);
538 if (ret != IS_SUCCESS) {
539 return ret;
540 }
541
542 uint8_t peerKeyAliasVal[SHA256_LEN] = { 0 };
543 Uint8Buff peerKeyAlias = { peerKeyAliasVal, SHA256_LEN };
544 ret = ImportAgreeKeyValue(osAccountId, agreeCredential, &keyValue, &peerKeyAlias);
545 if (ret != IS_SUCCESS) {
546 HcFree(keyValue.val);
547 HcFree(agreeCredIdByte.val);
548 return ret;
549 }
550
551 Uint8Buff selfCredIdByte = { NULL, 0 };
552 ret = CheckAndDelInvalidCred(osAccountId, selfCredId, &selfCredIdByte);
553 if (ret != IS_SUCCESS) {
554 HcFree(keyValue.val);
555 HcFree(agreeCredIdByte.val);
556 return ret;
557 }
558
559 ret = ComputePskAndDelInvalidKey(osAccountId,
560 agreeCredential->algorithmType, &selfCredIdByte, &peerKeyAlias, &agreeCredIdByte);
561 HcFree(keyValue.val);
562 HcFree(selfCredIdByte.val);
563 HcFree(agreeCredIdByte.val);
564 if (ret != IS_SUCCESS) {
565 return ret;
566 }
567 ret = AddCredAndSaveDb(osAccountId, agreeCredential);
568 if (ret != IS_SUCCESS) {
569 return ret;
570 }
571 if (DeepCopyString(StringGet(&agreeCredential->credId), returnData) != EOK) {
572 LOGE("Failed to return credId");
573 return IS_ERR_MEMORY_COPY;
574 }
575 return IS_SUCCESS;
576 }
577
AgreeCredentialImpl(int32_t osAccountId,const char * selfCredId,const char * requestParams,char ** returnData)578 int32_t AgreeCredentialImpl(int32_t osAccountId, const char *selfCredId, const char *requestParams, char **returnData)
579 {
580 CJson *reqJson = CreateJsonFromString(requestParams);
581 if (reqJson == NULL) {
582 LOGE("Failed to create reqJson from string!");
583 return IS_ERR_JSON_CREATE;
584 }
585 Credential *agreeCredential = CreateCredential();
586 if (agreeCredential == NULL) {
587 LOGE("Failed to malloc agreeCredential");
588 FreeJson(reqJson);
589 return IS_ERR_ALLOC_MEMORY;
590 }
591 int32_t ret = AgreeCredentialImplInner(osAccountId, selfCredId, reqJson, agreeCredential, returnData);
592 FreeJson(reqJson);
593 DestroyCredential(agreeCredential);
594 return ret;
595 }
596
RegCredListener(const char * appId,const CredChangeListener * listener)597 int32_t RegCredListener(const char *appId, const CredChangeListener *listener)
598 {
599 if ((appId == NULL) || (listener == NULL)) {
600 LOGE("The input parameter contains NULL value!");
601 return IS_ERR_INVALID_PARAMS;
602 }
603 if (!IsCredListenerSupported()) {
604 LOGE("Broadcast is not supported!");
605 return IS_ERR_NOT_SUPPORT;
606 }
607 return AddCredListener(appId, listener);
608 }
609
UnRegCredListener(const char * appId)610 int32_t UnRegCredListener(const char *appId)
611 {
612 if (appId == NULL) {
613 LOGE("The input parameter contains NULL value!");
614 return IS_ERR_INVALID_PARAMS;
615 }
616 if (!IsCredListenerSupported()) {
617 LOGE("Broadcast is not supported!");
618 return IS_ERR_NOT_SUPPORT;
619 }
620 return RemoveCredListener(appId);
621 }
622