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