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