• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * Copyright (c) 2022-2024 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
16import { CertAbstractVo } from './CertManagerVo/CertAbstractVo';
17import { CertInfoVo } from './CertManagerVo/CertInfoVo';
18import { CredentialAbstractVo } from './CertManagerVo/CredentialAbstractVo';
19import { CredentialVo } from './CertManagerVo/CredentialVo';
20import { BusinessError } from '@ohos.base';
21import CertManager from '@ohos.security.certManager';
22import cert from '@ohos.security.cert';
23
24const TAG = 'CertManager Model: ';
25
26export enum CMModelErrorCode {
27  CM_MODEL_ERROR_SUCCESS = 0,
28  CM_MODEL_ERROR_FAILED = -1,
29  CM_MODEL_ERROR_EXCEPTION = -2,
30  CM_MODEL_ERROR_UNKNOWN_OPT = -3,
31  CM_MODEL_ERROR_NOT_SUPPORT = -4,
32  CM_MODEL_ERROR_NOT_FOUND = -5,
33  CM_MODEL_ERROR_INCORRECT_FORMAT = -6,
34  CM_MODEL_ERROR_MAX_QUANTITY_REACHED = -7,
35  CM_MODEL_ERROR_ALIAS_LENGTH_REACHED_LIMIT = -8,
36  CM_MODEL_ERROR_PASSWORD_ERR = -9,
37  CM_MODEL_ERROR_ADVANCED_SECURITY = -10,
38  CM_MODEL_ERROR_
39}
40
41export enum CMModelOptType {
42  CM_MODEL_OPT_UNKNOWN = 0,
43  CM_MODEL_OPT_SYSTEM_CA = 1,
44  CM_MODEL_OPT_USER_CA = 2,
45  CM_MODEL_OPT_APP_CRED = 3,
46  CM_MODEL_OPT_PRIVATE_CRED = 4,
47  CM_MODEL_OPT_SYSTEM_CRED = 5,
48  CM_MODEL_OPT_USER_CA_P7B = 6,
49}
50
51export enum DialogErrorCode {
52  DIALOG_ERROR_INTERNAL = -1000,
53  DIALOG_OPERATION_CANCELS = -1001,
54  DIALOG_ERROR_PARAM_INVALID = -1010,
55}
56
57export enum CertManagerStore {
58  /* credential certificate store for end entity certificates. */
59  CERT_MANAGER_CREDENTIAL_STORE = 0,
60  /* read only, updated by system only. */
61  CERT_MANAGER_SYSTEM_TRUSTED_STORE = 1,
62  /* modifiable by applications and user. */
63  CERT_MANAGER_USER_TRUSTED_STORE = 2,
64  /* application specific trusted certificate store; modifiable by the application only. */
65  CERT_MANAGER_APPLICATION_TRUSTED_STORE = 3,
66}
67
68export class CertMangerModel {
69  getCertOrCredList(optType: CMModelOptType, callback: Function): void {
70    console.info(TAG + 'getCertOrCredList start');
71
72    switch (optType) {
73      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CA:
74        this.getSystemTrustedCertificateList((errCode: CMModelErrorCode, certList: Array<CertAbstractVo>) => {
75          callback(errCode, certList);
76        });
77        break;
78      case CMModelOptType.CM_MODEL_OPT_USER_CA:
79        this.getAllUserTrustedCertificates((errCode: CMModelErrorCode, certList: Array<CertAbstractVo>) => {
80          callback(errCode, certList);
81        });
82        break;
83      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
84        this.getAppCredList((errCode: CMModelErrorCode, credList: Array<CredentialAbstractVo>) => {
85          callback(errCode, credList);
86        });
87        break;
88      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CRED:
89        this.getSystemCredList((errCode: CMModelErrorCode, credList: Array<CredentialAbstractVo>) => {
90          callback(errCode, credList)
91        })
92	break;
93      default:
94        callback(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT, undefined);
95        break;
96    }
97  }
98
99  getCertOrCred(optType: CMModelOptType, uri: string, callback: Function): void {
100    console.info(TAG + 'getCertOrCred start');
101
102    switch (optType) {
103      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CA:
104        this.getSystemTrustedCertificate(uri, (errCode: CMModelErrorCode, certInfo: CertInfoVo) => {
105          callback(errCode, certInfo);
106        });
107        break;
108      case CMModelOptType.CM_MODEL_OPT_USER_CA:
109        this.getUserTrustedCertificate(uri, (errCode: CMModelErrorCode, certInfo: CertInfoVo) => {
110          callback(errCode, certInfo);
111        });
112        break;
113      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
114        this.getAppCredential(uri, (errCode: CMModelErrorCode, credInfo: CredentialVo) => {
115          callback(errCode, credInfo);
116        });
117        break;
118      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CRED:
119        this.getSystemCredential(uri, (errCode: CMModelErrorCode, credInfo: CredentialVo) => {
120          callback(errCode, credInfo)
121        })
122        break;
123      default:
124        callback(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT, undefined);
125        break;
126    }
127  }
128
129  deleteCertOrCred(optType: CMModelOptType, uri: string, callback: Function): void {
130    console.info(TAG + 'deleteCertOrCred start');
131
132    switch (optType) {
133      case CMModelOptType.CM_MODEL_OPT_USER_CA:
134        this.deleteUserTrustedCertificate(uri, (errCode: CMModelErrorCode) => {
135          callback(errCode);
136        });
137        break;
138      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
139        this.deleteAppCredential(uri, (errCode: CMModelErrorCode) => {
140          callback(errCode);
141        });
142        break;
143      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CA:
144        callback(CMModelErrorCode.CM_MODEL_ERROR_NOT_SUPPORT);
145      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CRED:
146        this.deleteSystemCredential(uri, (errCode: CMModelErrorCode) => {
147          callback(errCode)
148        })
149        break;
150      default:
151        callback(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT);
152        break;
153    }
154  }
155
156  setCertStatus(optType: CMModelOptType, uri: string, status: boolean, callback: Function): void {
157    console.info(TAG + 'setCertStatus start');
158
159    switch (optType) {
160      case CMModelOptType.CM_MODEL_OPT_USER_CA:
161        this.setCertificateStatus(uri, CertManagerStore.CERT_MANAGER_USER_TRUSTED_STORE, status,
162          (errCode: CMModelErrorCode) => {
163          callback(errCode);
164        });
165        break;
166      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CA:
167        this.setCertificateStatus(uri, CertManagerStore.CERT_MANAGER_SYSTEM_TRUSTED_STORE, status,
168          (errCode: CMModelErrorCode) => {
169          callback(errCode);
170        });
171        break;
172      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
173      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CRED:
174        callback(CMModelErrorCode.CM_MODEL_ERROR_NOT_SUPPORT);
175        break;
176      default:
177        callback(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT);
178        break;
179    }
180  }
181
182  delAllCertOrCred(optType: CMModelOptType, callback: Function): void {
183    console.info(TAG + 'delAllCertOrCred start');
184
185    switch (optType) {
186      case CMModelOptType.CM_MODEL_OPT_USER_CA:
187        this.delAllUserCertificate((errCode: CMModelErrorCode) => {
188          callback(errCode);
189        });
190        break;
191      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
192        this.delAllAppCredential((errCode: CMModelErrorCode) => {
193          callback(errCode);
194        });
195        break;
196      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CA:
197      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CRED:
198        callback(CMModelErrorCode.CM_MODEL_ERROR_NOT_SUPPORT);
199        break;
200      default:
201        callback(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT);
202        break;
203    }
204  }
205
206  getAuthAppList(optType: CMModelOptType, uri: string, callback: Function): void {
207    console.info(TAG + 'getAuthAppList start');
208
209    switch (optType) {
210      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
211        this.getAuthorizedAppList(uri, (errCode: CMModelErrorCode, appUidList: Array<string>) => {
212          callback(errCode, appUidList);
213        });
214        break;
215      case CMModelOptType.CM_MODEL_OPT_USER_CA:
216      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CA:
217      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CRED:
218        callback(CMModelErrorCode.CM_MODEL_ERROR_NOT_SUPPORT);
219        break;
220      default:
221        callback(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT);
222        break;
223    }
224  }
225
226  setAppAuthPromise(optType: CMModelOptType, uri: string, appUid: string, status: boolean): Promise<void> {
227    console.info(TAG + 'setAppAuth start');
228    switch (optType) {
229      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
230        return new Promise((resolve, reject) => {
231          this.setAuthorizedAppStatus(uri, appUid, status, (errCode: CMModelErrorCode, data: string) => {
232            if (errCode === CMModelErrorCode.CM_MODEL_ERROR_SUCCESS) {
233              resolve(void(data));
234            } else {
235              reject(errCode);
236            }
237          });
238        });
239      default:
240        return new Promise((resolve, reject) => {
241          reject(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT);
242        });
243    }
244  }
245
246  setAppAuth(optType: CMModelOptType, uri: string, appUid: string, status: boolean, callback: Function): void {
247    console.info(TAG + 'setAppAuth start');
248
249    switch (optType) {
250      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
251        this.setAuthorizedAppStatus(uri, appUid, status, (errCode: CMModelErrorCode, data: string) => {
252          callback(errCode, data);
253        });
254        break;
255      case CMModelOptType.CM_MODEL_OPT_USER_CA:
256      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CA:
257      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CRED:
258        callback(CMModelErrorCode.CM_MODEL_ERROR_NOT_SUPPORT);
259        break;
260      default:
261        callback(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT);
262        break;
263    }
264  }
265
266  installCertOrCred(optType: CMModelOptType, alias: string, data: Uint8Array, pwd: string, callback: Function): void {
267    console.info(TAG + 'installCertOrCred start');
268    switch (optType) {
269      case CMModelOptType.CM_MODEL_OPT_USER_CA:
270        this.installUserCertificate(data, alias, optType, (errCode: CMModelErrorCode, uri: string) => {
271          callback(errCode, uri);
272        });
273        break;
274      case CMModelOptType.CM_MODEL_OPT_USER_CA_P7B:
275        this.installUserCertificate(data, alias, optType, (errCode: CMModelErrorCode, uri: string) => {
276          callback(errCode, uri);
277        });
278        break;
279      case CMModelOptType.CM_MODEL_OPT_APP_CRED:
280        this.installPublicCertificate(data, alias, pwd, (errCode: CMModelErrorCode) => {
281          callback(errCode);
282        });
283        break;
284      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CRED:
285        this.installSystemAppCertificate(data, alias, pwd, (errCode: CMModelErrorCode) => {
286          callback(errCode);
287        });
288        break;
289      case CMModelOptType.CM_MODEL_OPT_SYSTEM_CA:
290        callback(CMModelErrorCode.CM_MODEL_ERROR_NOT_SUPPORT);
291        break;
292      default:
293        callback(CMModelErrorCode.CM_MODEL_ERROR_UNKNOWN_OPT);
294        break;
295    }
296  }
297
298  private async getSystemTrustedCertificateList(callback: Function): Promise<void> {
299    console.info(TAG + 'getSystemTrustedCertificateList start');
300    try {
301      let subjectNameCN: string = '';
302      let result = await CertManager.getSystemTrustedCertificateList();
303      let certList: CertAbstractVo[] = [];
304      let regex: RegExp = new RegExp('(?<=CN=).*?(?=,)', 'g');
305      if (result.certList !== undefined) {
306        for (let i = 0; i < result.certList.length; i++) {
307          if (result.certList[i].subjectName.length !== 0) {
308            let temp = result.certList[i].subjectName.match(regex);
309            subjectNameCN = (temp !== undefined) ? String(temp) : '';
310            console.info('subjectNameCN is:' + subjectNameCN);
311          }
312          certList.push(new CertAbstractVo(String(result.certList[i].uri), String(result.certList[i].certAlias),
313            Boolean(result.certList[i].status), String(result.certList[i].subjectName), String(subjectNameCN)));
314        }
315        console.info(TAG + 'getSystemTrustedCertificateList end');
316        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, certList);
317      } else {
318        console.error(TAG + 'getSystemTrustedCertificateList failed, undefined');
319        callback(CMModelErrorCode.CM_MODEL_ERROR_FAILED, undefined);
320      }
321    } catch (err) {
322      let e: BusinessError = err as BusinessError;
323      console.error(TAG + 'getSystemTrustedCertificateList err, message: ' + e.message + ', code: ' + e.code);
324      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION, undefined);
325    }
326  }
327
328  private async getSystemTrustedCertificate(certUri: string, callback: Function): Promise<void> {
329    console.info(TAG + 'getSystemTrustedCertificate start');
330    try {
331      let result = await CertManager.getSystemTrustedCertificate(certUri);
332      let subjectNameMap: Map<string, string> = new Map();
333      let issuerNameMap: Map<string, string> = new Map();
334      let dateMap: Map<string, string> = new Map();
335      let regex1: RegExp = new RegExp('(?<=CN=).*?(?=,)', 'g');
336      let regex2: RegExp = new RegExp('(?<=OU=).*?(?=,)', 'g');
337      let regex3: RegExp = new RegExp('(?<=O=).*', 'g');
338
339      if (result.certInfo !== undefined) {
340        if (result.certInfo.subjectName.length !== 0) {
341          let subjectNameCN = result.certInfo.subjectName.match(regex1);
342          console.info('subjectNameCN is:' + subjectNameCN);
343          let subjectNameOU = result.certInfo.subjectName.match(regex2);
344          console.info('subjectNameOU is:' + subjectNameOU);
345          let subjectNameO = result.certInfo.subjectName.match(regex3);
346          console.info('subjectNameO is:' + subjectNameO);
347          subjectNameMap.set('常用名称:', String(subjectNameCN));
348          subjectNameMap.set('组织:', String(subjectNameO));
349          subjectNameMap.set('组织单位:', String(subjectNameOU));
350          subjectNameMap.set('序列号:', String(result.certInfo.serial));
351        }
352        if (result.certInfo.issuerName.length !== 0) {
353          let issuerNameCN = result.certInfo.issuerName.match(regex1);
354          console.info('issuerNameCN is:' + issuerNameCN);
355          let issuerNameOU = result.certInfo.issuerName.match(regex2);
356          console.info('issuerNameOU is:' + issuerNameOU);
357          let issuerNameO = result.certInfo.issuerName.match(regex3);
358          console.info('issuerNameO is:' + issuerNameO);
359          issuerNameMap.set('常用名称:', String(issuerNameCN));
360          issuerNameMap.set('组织:', String(issuerNameO));
361          issuerNameMap.set('组织单位:', String(issuerNameOU));
362        }
363        dateMap.set('颁发时间:', String(result.certInfo.notBefore));
364        dateMap.set('有效期至:', String(result.certInfo.notAfter));
365
366        let certData: Uint8Array = result.certInfo.cert;
367        let certInfo = new CertInfoVo(String(result.certInfo.uri), String(result.certInfo.certAlias),
368          Boolean(result.certInfo.status), String(result.certInfo.issuerName), String(result.certInfo.subjectName),
369          String(result.certInfo.serial), String(result.certInfo.notBefore),
370          String(result.certInfo.notAfter), String(result.certInfo.fingerprintSha256),
371          certData, subjectNameMap, issuerNameMap, dateMap);
372        console.info(TAG + 'getSystemTrustedCertificate end');
373        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, certInfo);
374      } else {
375        console.error(TAG + 'getSystemTrustedCertificate failed, undefined');
376        callback(CMModelErrorCode.CM_MODEL_ERROR_FAILED, undefined);
377      }
378    } catch (err) {
379      let e: BusinessError = err as BusinessError;
380      console.error(TAG + 'getSystemTrustedCertificate err, message: ' + e.message + ', code: ' + e.code);
381      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION, undefined);
382    }
383  }
384
385  private async getAllUserTrustedCertificates(callback: Function): Promise<void> {
386    console.info(TAG + 'getAllUserTrustedCertificates start');
387    try {
388      let subjectNameCN: string = '';
389      let result = await CertManager.getAllUserTrustedCertificates();
390      let certList: CertAbstractVo[] = [];
391      let regex: RegExp = new RegExp('(?<=CN=).*?(?=,)', 'g');
392      if (result.certList !== undefined) {
393        for (let i = 0; i < result.certList.length; i++) {
394          if (result.certList[i].subjectName.length !== 0) {
395            let temp = result.certList[i].subjectName.match(regex);
396            subjectNameCN = (temp !== undefined) ? String(temp) : '';
397            console.info('subjectNameCN is:' + subjectNameCN);
398          }
399          if (String(result.certList[i].uri).indexOf('u=0;') === -1) {
400            certList.push(new CertAbstractVo(String(result.certList[i].uri), String(result.certList[i].certAlias),
401              Boolean(result.certList[i].status), String(result.certList[i].subjectName), String(subjectNameCN)));
402          }
403        }
404        console.info(TAG + 'getAllUserTrustedCertificates end');
405        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, certList);
406      } else {
407        console.error(TAG + 'getAllUserTrustedCertificates failed, undefined');
408        callback(CMModelErrorCode.CM_MODEL_ERROR_FAILED, undefined);
409      }
410    } catch (err) {
411      let e: BusinessError = err as BusinessError;
412      console.error(TAG + 'getAllUserTrustedCertificates err, message: ' + e.message + ', code: ' + e.code);
413      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
414    }
415  }
416
417  private async getUserTrustedCertificate(certUri: string, callback: Function): Promise<void> {
418    console.info(TAG + 'getUserTrustedCertificate start');
419    try {
420      let result = await CertManager.getUserTrustedCertificate(certUri);
421      let subjectNameMap: Map<string, string> = new Map();
422      let issuerNameMap: Map<string, string> = new Map();
423      let dateMap: Map<string, string> = new Map();
424      let regex1: RegExp = new RegExp('(?<=CN=).*?(?=,)', 'g');
425      let regex2: RegExp = new RegExp('(?<=OU=).*?(?=,)', 'g');
426      let regex3: RegExp = new RegExp('(?<=O=).*', 'g');
427
428      if (result.certInfo !== undefined) {
429        if (result.certInfo.subjectName.length !== 0) {
430          let subjectNameCN = result.certInfo.subjectName.match(regex1);
431          console.info('subjectNameCN is:' + subjectNameCN);
432          let subjectNameOU = result.certInfo.subjectName.match(regex2);
433          console.info('subjectNameOU is:' + subjectNameOU);
434          let subjectNameO = result.certInfo.subjectName.match(regex3);
435          console.info('SubjectNameO is:' + subjectNameO);
436          subjectNameMap.set('常用名称:', String(subjectNameCN));
437          subjectNameMap.set('组织:', String(subjectNameO));
438          subjectNameMap.set('组织单位:', String(subjectNameOU));
439          subjectNameMap.set('序列号:', String(result.certInfo.serial));
440        }
441        if (result.certInfo.issuerName.length !== 0) {
442          let issuerNameCN = result.certInfo.issuerName.match(regex1);
443          console.info('issuerNameCN is:' + issuerNameCN);
444          let issuerNameOU = result.certInfo.issuerName.match(regex2);
445          console.info('issuerNameOU is:' + issuerNameOU);
446          let issuerNameO = result.certInfo.issuerName.match(regex3);
447          console.info('issuerNameO is:' + issuerNameO);
448          issuerNameMap.set('常用名称:', String(issuerNameCN));
449          issuerNameMap.set('组织:', String(issuerNameO));
450          issuerNameMap.set('组织单位:', String(issuerNameOU));
451        }
452        dateMap.set('颁发时间:', String(result.certInfo.notBefore));
453        dateMap.set('有效期至:', String(result.certInfo.notAfter));
454        let certData: Uint8Array = result.certInfo.cert;
455        let certInfo = new CertInfoVo(String(result.certInfo.uri), String(result.certInfo.certAlias),
456          Boolean(result.certInfo.status), String(result.certInfo.issuerName), String(result.certInfo.subjectName),
457          String(result.certInfo.serial), String(result.certInfo.notBefore),
458          String(result.certInfo.notAfter), String(result.certInfo.fingerprintSha256),
459          certData, subjectNameMap, issuerNameMap, dateMap);
460        console.info(TAG + 'getUserTrustedCertificate end');
461        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, certInfo);
462      } else {
463        console.error(TAG + 'getUserTrustedCertificate failed, undefined');
464        callback(CMModelErrorCode.CM_MODEL_ERROR_FAILED, undefined);
465      }
466    } catch (err) {
467      let e: BusinessError = err as BusinessError;
468      console.error(TAG + 'getUserTrustedCertificate err, message: ' + e.message + ', code: ' + e.code);
469      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION, undefined);
470    }
471  }
472
473  private async deleteUserTrustedCertificate(certUri: string, callback: Function): Promise<void> {
474    console.info(TAG + 'deleteUserTrustedCertificate start');
475    try {
476      await CertManager.uninstallUserTrustedCertificate(certUri);
477      console.info(TAG + 'deleteUserTrustedCertificate end');
478      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
479    } catch (err) {
480      let e: BusinessError = err as BusinessError;
481      console.error(TAG + 'deleteUserTrustedCertificate err, message: ' + e.message + ', code: ' + e.code);
482      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
483    }
484  }
485
486  private async setCertificateStatus(certUri: string, store: number,
487                                     status: boolean, callback: Function): Promise<void> {
488    console.info(TAG + 'setCertificateStatus start');
489    try {
490      await CertManager.setCertificateStatus(certUri, store, status);
491      console.info(TAG + 'setCertificateStatus end');
492      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
493    } catch (err) {
494      let e: BusinessError = err as BusinessError;
495      console.error(TAG + 'setCertificateStatus failed with err, message: ' + e.message + ', code: ' + e.code);
496      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
497    }
498  }
499
500  private async getAppCredList(callback: Function): Promise<void> {
501    console.info(TAG + 'getAppCredList start');
502    try {
503      let result = await CertManager.getAllPublicCertificates();
504      let credList: CredentialAbstractVo[] = [];
505      if (result && result.credentialList !== undefined) {
506        for (let i = 0; i < result.credentialList.length; i++) {
507          credList.push(new CredentialAbstractVo(String(result.credentialList[i].type),
508            String(result.credentialList[i].alias), String(result.credentialList[i].keyUri)));
509        }
510        console.info(TAG + 'getAppCredList end');
511        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, credList);
512      } else {
513        console.error(TAG + 'getAppCredList failed, undefined.');
514        callback(CMModelErrorCode.CM_MODEL_ERROR_FAILED, undefined);
515      }
516    } catch (err) {
517      let e: BusinessError = err as BusinessError;
518      console.error(TAG + 'getAppCredList failed with err, message: ' + e.message + ', code: ' + e.code);
519      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
520    }
521  }
522
523  private async getSystemCredList(callback: Function): Promise<void> {
524    console.info(TAG + 'getSystemList start');
525    try {
526      let result = await CertManager.getAllSystemAppCertificates();
527      let credList: CredentialAbstractVo[] = [];
528      if (result.credentialList !== undefined) {
529        for (let i = 0; i < result.credentialList.length; i++) {
530          credList.push(new CredentialAbstractVo(String(result.credentialList[i].type),
531            String(result.credentialList[i].alias), String(result.credentialList[i].keyUri)));
532        }
533        console.info(TAG + 'getSystemCredList end');
534        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, credList);
535      } else {
536        console.error(TAG + 'getSystemCredList failed, undefined.');
537        callback(CMModelErrorCode.CM_MODEL_ERROR_FAILED, undefined)
538      }
539    } catch (err) {
540      let e: BusinessError = err as BusinessError;
541      console.error(TAG, 'getSystemCredList failed with err, message: ' + e.message + ', code: ' + e.code)
542      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION)
543    }
544  }
545
546  private async getAppCredential(certUri: string, callback: Function): Promise<void> {
547    console.info(TAG + 'getAppCredential start');
548    try {
549      let result = await CertManager.getPublicCertificate(certUri);
550      if (result.credential !== undefined) {
551        let certData: Uint8Array = result.credential.credData;
552        let credInfo = new CredentialVo(String(result.credential.type), String(result.credential.alias),
553          String(result.credential.keyUri), Number(result.credential.certNum),
554          Number(result.credential.keyNum), certData);
555        console.info(TAG + 'getAppCredential end');
556        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, credInfo);
557      } else {
558        console.error(TAG + 'getAppCredential failed, undefined');
559        callback(CMModelErrorCode.CM_MODEL_ERROR_FAILED, undefined);
560      }
561    } catch (err) {
562      let e: BusinessError = err as BusinessError;
563      console.error(TAG + 'getAppCredential failed with err, message: ' + e.message + ', code: ' + e.code);
564      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION, undefined);
565    }
566  }
567
568  private async getSystemCredential(certUri: string, callback: Function): Promise<void> {
569    console.info(TAG + 'getSystemCredential start');
570    try {
571      let result = await CertManager.getSystemAppCertificate(certUri);
572      if (result.credential !== undefined) {
573        let certData: Uint8Array = result.credential.credData;
574        let credInfo = new CredentialVo(String(result.credential.type), String(result.credential.alias),
575          String(result.credential.keyUri), Number(result.credential.certNum),
576          Number(result.credential.keyNum), certData);
577        console.info(TAG + 'getSystemCredential end');
578        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, credInfo);
579      } else {
580        console.error(TAG + 'getSystemCredential failed, undefined');
581        callback(CMModelErrorCode.CM_MODEL_ERROR_FAILED, undefined);
582      }
583    } catch (err) {
584      let e: BusinessError = err as BusinessError;
585      console.error(TAG + 'getSystemCredential failed with err, message: ' + e.message + ', code: ' + e.code);
586      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION, undefined);
587    }
588  }
589
590  private async deleteAppCredential(certUri: string, callback: Function): Promise<void> {
591    console.info(TAG + 'deleteAppCredential start');
592    try {
593      await CertManager.uninstallPublicCertificate(certUri);
594      console.info(TAG + 'deleteAppCredential end');
595      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
596    } catch (err) {
597      let e: BusinessError = err as BusinessError;
598      console.error(TAG + 'deleteAppCredential failed with err, message: ' + e.message + ', code: ' + e.code);
599      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
600    }
601  }
602
603  private async deleteSystemCredential(certUri: string, callback: Function): Promise<void> {
604    console.info(TAG, 'deleteSystemCredential start');
605    try {
606      await CertManager.uninstallSystemAppCertificate(certUri);
607      console.info(TAG, 'deleteSystemCredential end');
608      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
609    } catch (err) {
610      let e: BusinessError = err as BusinessError;
611      console.error(TAG + 'deleteSystemCredential failed with err, message: ' + e.message + ', code: ' + e.code);
612      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
613    }
614  }
615
616  private async delAllUserCertificate(callback: Function): Promise<void> {
617    console.info(TAG + 'delAllUserCertificate start');
618    try {
619      await CertManager.uninstallAllUserTrustedCertificate();
620      console.info(TAG + 'delAllUserCertificate end');
621      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
622    } catch (err) {
623      let e: BusinessError = err as BusinessError;
624      console.error(TAG + 'delAllUserCertificate failed with err, message: ' + e.message + ', code: ' + e.code);
625      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
626    }
627  }
628
629  private async delAllAppCredential(callback: Function): Promise<void> {
630    console.info(TAG + 'delAllAppCredential start');
631    try {
632      await CertManager.uninstallAllAppCertificate();
633      console.info(TAG + 'delAllAppCredential end');
634      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
635    } catch (err) {
636      let e: BusinessError = err as BusinessError;
637      console.error(TAG + 'delAllAppCredential failed with err, message: ' + e.message + ', code: ' + e.code);
638      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
639    }
640  }
641
642  private async getAuthorizedAppList(uri: string, callback: Function): Promise<void> {
643    console.info(TAG + 'getAuthorizedAppList start');
644    try {
645      let result = await CertManager.getAuthorizedAppList(uri);
646      console.info(TAG + 'getAuthorizedAppList end');
647      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, result.appUidList);
648    } catch (err) {
649      let e: BusinessError = err as BusinessError;
650      console.error(TAG + 'getAuthorizedAppList failed with err, message: ' + e.message + ', code: ' + e.code);
651      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION, undefined);
652    }
653  }
654
655  private async setAuthorizedAppStatus(
656    uri: string,
657    appUid: string,
658    status: boolean,
659    callback: Function
660  ): Promise<void> {
661    console.info(TAG + 'setAuthorizedAppStatus start');
662    try {
663      if (status) {
664        let result = await CertManager.grantPublicCertificate(uri, appUid);
665        console.info(TAG + 'setAuthorizedAppStatus true end');
666        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, result.uri);
667      } else {
668        console.info(TAG + 'appId:' + appUid + 'uri:' + uri);
669        await CertManager.removeGrantedPublicCertificate(uri, appUid);
670        console.info(TAG + 'setAuthorizedAppStatus false end');
671        callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
672      }
673    } catch (err) {
674      let e: BusinessError = err as BusinessError;
675      console.error(TAG + 'setAuthorizedAppStatus failed with err, message: ' + e.message + ', code: ' + e.code);
676      callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
677    }
678  }
679
680  private async installUserCertificate(data: Uint8Array, alias: string, optType: CMModelOptType, callback: Function): Promise<void> {
681    console.info(TAG + 'installUserCertificate start');
682    if ((data === undefined) || (data.length === 0)) {
683      callback(CMModelErrorCode.CM_MODEL_ERROR_INCORRECT_FORMAT);
684      console.error(TAG + 'installUserCertificate data is empty.');
685      return;
686    }
687    try {
688      let certFormat: CertManager.CertFileFormat = CertManager.CertFileFormat.PEM_DER;
689      if (optType == CMModelOptType.CM_MODEL_OPT_USER_CA_P7B) {
690        certFormat = CertManager.CertFileFormat.P7B;
691      }
692      let result = await CertManager.installUserTrustedCertificate({
693        inData: data,
694        alias: alias,
695        certFormat: certFormat,
696        certScope: CertManager.CertScope.CURRENT_USER
697      });
698      console.info(TAG + 'installUserCertificate end');
699      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS, result.uri);
700    } catch (err) {
701      let e: BusinessError = err as BusinessError;
702      if (e.code === CertManager.CMErrorCode.CM_ERROR_INCORRECT_FORMAT) {
703        callback(CMModelErrorCode.CM_MODEL_ERROR_INCORRECT_FORMAT)
704      } else if (e.code === CertManager.CMErrorCode.CM_ERROR_MAX_CERT_COUNT_REACHED) {
705        callback(CMModelErrorCode.CM_MODEL_ERROR_MAX_QUANTITY_REACHED)
706      } else if (e.code === CertManager.CMErrorCode.CM_ERROR_ALIAS_LENGTH_REACHED_LIMIT) {
707        callback(CMModelErrorCode.CM_MODEL_ERROR_ALIAS_LENGTH_REACHED_LIMIT)
708      } else {
709        console.error(TAG + 'installUserCertificate failed with err, message: ' + e.message + ', code: ' + e.code);
710        callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
711      }
712    }
713  }
714
715  private async installPublicCertificate(
716    data: Uint8Array,
717    alias: string,
718    pwd: string,
719    callback: Function
720  ): Promise<void> {
721    console.info(TAG + 'installPublicCertificate start');
722    try {
723      await CertManager.installPublicCertificate(data, pwd, alias);
724      console.info(TAG + 'installPublicCertificate end');
725      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
726    } catch (err) {
727      let e: BusinessError = err as BusinessError;
728      if (e.code === CertManager.CMErrorCode.CM_ERROR_INCORRECT_FORMAT) {
729        callback(CMModelErrorCode.CM_MODEL_ERROR_INCORRECT_FORMAT)
730      } else if (e.code === CertManager.CMErrorCode.CM_ERROR_MAX_CERT_COUNT_REACHED) {
731        callback(CMModelErrorCode.CM_MODEL_ERROR_MAX_QUANTITY_REACHED)
732      } else if (e.code === CertManager.CMErrorCode.CM_ERROR_ALIAS_LENGTH_REACHED_LIMIT) {
733        callback(CMModelErrorCode.CM_MODEL_ERROR_ALIAS_LENGTH_REACHED_LIMIT)
734      } else if (e.code === CertManager.CMErrorCode.CM_ERROR_PASSWORD_IS_ERR) {
735        callback(CMModelErrorCode.CM_MODEL_ERROR_PASSWORD_ERR);
736      } else {
737        console.error(TAG + 'installPublicCertificate failed with err, message: ' + e.message + ', code: ' + e.code);
738        callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
739      }
740    }
741  }
742
743  private async installSystemAppCertificate(
744    data: Uint8Array,
745    alias: string,
746    pwd: string,
747    callback: Function
748  ): Promise<void> {
749    console.info(TAG, 'installSystemAppCertificate start');
750    try {
751      await CertManager.installSystemAppCertificate(data, pwd, alias);
752      console.info(TAG + 'installSystemAppCertificate end');
753      callback(CMModelErrorCode.CM_MODEL_ERROR_SUCCESS);
754    } catch (err) {
755      let e: BusinessError = err as BusinessError;
756      if (e.code === CertManager.CMErrorCode.CM_ERROR_INCORRECT_FORMAT) {
757        callback(CMModelErrorCode.CM_MODEL_ERROR_INCORRECT_FORMAT);
758      } else if (e.code === CertManager.CMErrorCode.CM_ERROR_MAX_CERT_COUNT_REACHED) {
759        callback(CMModelErrorCode.CM_MODEL_ERROR_MAX_QUANTITY_REACHED);
760      } else if (e.code === CertManager.CMErrorCode.CM_ERROR_ALIAS_LENGTH_REACHED_LIMIT) {
761        callback(CMModelErrorCode.CM_MODEL_ERROR_ALIAS_LENGTH_REACHED_LIMIT);
762      } else if (e.code === CertManager.CMErrorCode.CM_ERROR_PASSWORD_IS_ERR) {
763        callback(CMModelErrorCode.CM_MODEL_ERROR_PASSWORD_ERR);
764      } else {
765        console.error(TAG + 'installSystemAppCertificate failed with err, message: ' + e.message + ', code: ' + e.code);
766        callback(CMModelErrorCode.CM_MODEL_ERROR_EXCEPTION);
767      }
768    }
769  }
770}
771
772let certMangerModel = new CertMangerModel();
773
774export default certMangerModel as CertMangerModel;
775