• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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