• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 密钥派生(ArkTS)
2
3
4以HKDF和PBKDF为例,完成密钥派生。具体的场景介绍及支持的算法规格,请参考[密钥生成支持的算法](huks-key-generation-overview.md#支持的算法)。
5
6
7## 开发步骤
8
9**生成密钥**
10
111. 指定密钥别名。
12
132. 初始化密钥属性集,可指定参数HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG(可选),用于标识基于该密钥派生出的密钥是否由HUKS管理。
14
15    - 当TAG设置为HUKS_STORAGE_ONLY_USED_IN_HUKS时,表示基于该密钥派生出的密钥,由HUKS管理,可保证派生密钥全生命周期不出安全环境。
16
17    - 当TAG设置为HUKS_STORAGE_KEY_EXPORT_ALLOWED时,表示基于该密钥派生出的密钥,返回给调用方管理,由业务自行保证密钥安全。
18
19    - 若业务未设置TAG的具体值,表示基于该密钥派生出的密钥,即可由HUKS管理,也可返回给调用方管理,业务可在后续派生时再选择使用何种方式保护密钥。
20
213. 调用[generateKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksgeneratekeyitem9)生成密钥,具体请参考[密钥生成](huks-key-generation-overview.md)。
22
23除此之外,开发者也可以参考[密钥导入](huks-key-import-overview.md),导入已有的密钥。
24
25**密钥派生**
26
271. 获取密钥别名,指定对应的属性参数HuksOptions。
28
29    可指定参数HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG(可选),用于标识派生得到的密钥是否由HUKS管理。
30
31    | 生成 | 派生 | 规格 |
32    | -------- | -------- | -------- |
33    | HUKS_STORAGE_ONLY_USED_IN_HUKS | HUKS_STORAGE_ONLY_USED_IN_HUKS | 密钥由HUKS管理 |
34    | HUKS_STORAGE_KEY_EXPORT_ALLOWED | HUKS_STORAGE_KEY_EXPORT_ALLOWED | 密钥返回给调用方管理 |
35    | 未指定TAG具体值 | HUKS_STORAGE_ONLY_USED_IN_HUKS | 密钥由HUKS管理 |
36    | 未指定TAG具体值 | HUKS_STORAGE_KEY_EXPORT_ALLOWED | 密钥返回给调用方管理 |
37    | 未指定TAG具体值 | 未指定TAG具体值 | 密钥返回给调用方管理 |
38
39    注:派生时指定的TAG值,不可与生成时指定的TAG值冲突。表格中仅列举有效的指定方式。
40
41
422. 调用[initSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksinitsession9)初始化密钥会话,并获取会话的句柄handle。
43
443. 调用[updateSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksupdatesession9)更新密钥会话。
45
464. 调用[finishSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksfinishsession9)结束密钥会话,完成派生。
47
48**删除密钥**
49
50当密钥废弃不用时,需要调用[deleteKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksdeletekeyitem9)删除密钥,具体请参考[密钥删除](huks-delete-key-arkts.md)。
51## 开发案例
52### HKDF
53```ts
54/*
55 * 以下以HKDF密钥的Promise操作使用为例
56 */
57import { huks } from '@kit.UniversalKeystoreKit';
58
59/*
60 * 确定密钥别名和封装密钥属性参数集
61 */
62let srcKeyAlias = "hkdf_Key";
63let deriveHkdfInData = "deriveHkdfTestIndata";
64let handle: number;
65let finishOutData: Uint8Array;
66let HuksKeyDeriveKeySize = 32;
67/* 集成生成密钥参数集 */
68let properties: Array<huks.HuksParam> = [
69  {
70    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
71    value: huks.HuksKeyAlg.HUKS_ALG_AES,
72  }, {
73  tag: huks.HuksTag.HUKS_TAG_PURPOSE,
74  value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
75}, {
76  tag: huks.HuksTag.HUKS_TAG_DIGEST,
77  value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
78}, {
79  tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
80  value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128,
81}, {
82  tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,
83  value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
84}];
85
86let huksOptions: huks.HuksOptions = {
87  properties: properties,
88  inData: new Uint8Array(new Array())
89}
90/* 集成init时密钥参数集 */
91let initProperties: Array<huks.HuksParam> = [{
92  tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
93  value: huks.HuksKeyAlg.HUKS_ALG_HKDF,
94}, {
95  tag: huks.HuksTag.HUKS_TAG_PURPOSE,
96  value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
97}, {
98  tag: huks.HuksTag.HUKS_TAG_DIGEST,
99  value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
100}, {
101  tag: huks.HuksTag.HUKS_TAG_DERIVE_KEY_SIZE,
102  value: HuksKeyDeriveKeySize,
103}];
104
105let initOptions: huks.HuksOptions = {
106  properties: initProperties,
107  inData: new Uint8Array(new Array())
108}
109/* 集成finish时密钥参数集 */
110let finishProperties: Array<huks.HuksParam> = [{
111  tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,
112  value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
113}, {
114  tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS,
115  value: true,
116}, {
117  tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
118  value: huks.HuksKeyAlg.HUKS_ALG_AES,
119}, {
120  tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
121  value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256,
122}, {
123  tag: huks.HuksTag.HUKS_TAG_PURPOSE,
124  value:
125  huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT |
126  huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT,
127}, {
128  tag: huks.HuksTag.HUKS_TAG_DIGEST,
129  value: huks.HuksKeyDigest.HUKS_DIGEST_NONE,
130}, {
131  tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS,
132  value: StringToUint8Array(srcKeyAlias),
133}, {
134  tag: huks.HuksTag.HUKS_TAG_PADDING,
135  value: huks.HuksKeyPadding.HUKS_PADDING_NONE,
136}, {
137  tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,
138  value: huks.HuksCipherMode.HUKS_MODE_ECB,
139}];
140let finishOptions: huks.HuksOptions = {
141  properties: finishProperties,
142  inData: new Uint8Array(new Array())
143}
144
145function StringToUint8Array(str: String) {
146  let arr: number[] = new Array();
147  for (let i = 0, j = str.length; i < j; ++i) {
148    arr.push(str.charCodeAt(i));
149  }
150  return new Uint8Array(arr);
151}
152
153class throwObject {
154  isThrow = false;
155}
156
157function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
158  return new Promise<void>((resolve, reject) => {
159    try {
160      huks.generateKeyItem(keyAlias, huksOptions, (error, data) => {
161        if (error) {
162          reject(error);
163        } else {
164          resolve(data);
165        }
166      });
167    } catch (error) {
168      throwObject.isThrow = true;
169      throw (error as Error);
170    }
171  });
172}
173
174async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
175  console.info(`enter promise generateKeyItem`);
176  let throwObject: throwObject = { isThrow: false };
177  try {
178    await generateKeyItem(keyAlias, huksOptions, throwObject)
179      .then((data) => {
180        console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`);
181      })
182      .catch((error: Error) => {
183        if (throwObject.isThrow) {
184          throw (error as Error);
185        } else {
186          console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`);
187        }
188      });
189  } catch (error) {
190    console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`);
191  }
192}
193
194function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
195  return new Promise<huks.HuksSessionHandle>((resolve, reject) => {
196    try {
197      huks.initSession(keyAlias, huksOptions, (error, data) => {
198        if (error) {
199          reject(error);
200        } else {
201          resolve(data);
202        }
203      });
204    } catch (error) {
205      throwObject.isThrow = true;
206      throw (error as Error);
207    }
208  });
209}
210
211async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
212  console.info(`enter promise doInit`);
213  let throwObject: throwObject = { isThrow: false };
214  try {
215    await initSession(keyAlias, huksOptions, throwObject)
216      .then((data) => {
217        console.info(`promise: doInit success, data = ${JSON.stringify(data)}`);
218        handle = data.handle;
219      })
220      .catch((error: Error) => {
221        if (throwObject.isThrow) {
222          throw (error as Error);
223        } else {
224          console.error(`promise: doInit failed, ${JSON.stringify(error)}`);
225        }
226      });
227  } catch (error) {
228    console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`);
229  }
230}
231
232function updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {
233  return new Promise<huks.HuksOptions>((resolve, reject) => {
234    try {
235      huks.updateSession(handle, huksOptions, (error, data) => {
236        if (error) {
237          reject(error);
238        } else {
239          resolve(data);
240        }
241      });
242    } catch (error) {
243      throwObject.isThrow = true;
244      throw (error as Error);
245    }
246  });
247}
248
249async function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) {
250  console.info(`enter promise doUpdate`);
251  let throwObject: throwObject = { isThrow: false };
252  try {
253    await updateSession(handle, huksOptions, throwObject)
254      .then((data) => {
255        console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`);
256      })
257      .catch((error: Error) => {
258        if (throwObject.isThrow) {
259          throw (error as Error);
260        } else {
261          console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`);
262        }
263      });
264  } catch (error) {
265    console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`);
266  }
267}
268
269function finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {
270  return new Promise<huks.HuksReturnResult>((resolve, reject) => {
271    try {
272      huks.finishSession(handle, huksOptions, (error, data) => {
273        if (error) {
274          reject(error);
275        } else {
276          resolve(data);
277        }
278      });
279    } catch (error) {
280      throwObject.isThrow = true;
281      throw (error as Error);
282    }
283  });
284}
285
286async function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) {
287  console.info(`enter promise doFinish`);
288  let throwObject: throwObject = { isThrow: false };
289  try {
290    await finishSession(handle, huksOptions, throwObject)
291      .then((data) => {
292        finishOutData = data.outData as Uint8Array;
293        console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`);
294      })
295      .catch((error: Error) => {
296        if (throwObject.isThrow) {
297          throw (error as Error);
298        } else {
299          console.error(`promise: doFinish failed, ${JSON.stringify(error)}`);
300        }
301      });
302  } catch (error) {
303    console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`);
304  }
305}
306
307function deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
308  return new Promise<void>((resolve, reject) => {
309    try {
310      huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => {
311        if (error) {
312          reject(error);
313        } else {
314          resolve(data);
315        }
316      });
317    } catch (error) {
318      throwObject.isThrow = true;
319      throw (error as Error);
320    }
321  });
322}
323
324async function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
325  console.info(`enter promise deleteKeyItem`);
326  let throwObject: throwObject = { isThrow: false };
327  try {
328    await deleteKeyItem(keyAlias, huksOptions, throwObject)
329      .then((data) => {
330        console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`);
331      })
332      .catch((error: Error) => {
333        if (throwObject.isThrow) {
334          throw (error as Error);
335        } else {
336          console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`);
337        }
338      });
339  } catch (error) {
340    console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`);
341  }
342}
343
344async function testDerive() {
345  /* 生成密钥 */
346  await publicGenKeyFunc(srcKeyAlias, huksOptions);
347  /* 进行派生操作 */
348  await publicInitFunc(srcKeyAlias, initOptions);
349  initOptions.inData = StringToUint8Array(deriveHkdfInData);
350  await publicUpdateFunc(handle, initOptions);
351  await publicFinishFunc(handle, finishOptions);
352  await publicDeleteKeyFunc(srcKeyAlias, huksOptions);
353}
354```
355### PBKDF2
356
357```ts
358/*
359 * 以下以PBKDF2密钥的Promise操作使用为例
360 */
361import { huks } from '@kit.UniversalKeystoreKit';
362
363/*
364 * 确定密钥别名和封装密钥属性参数集
365 */
366let srcKeyAlias = "pbkdf2_Key";
367let password = "myPassword";
368let salt = "mySalt";
369let iterationCount = 10000;
370let derivedKeySize = 32;
371let handle: number;
372let finishOutData: Uint8Array;
373
374/* 集成生成密钥参数集 */
375let properties: Array<huks.HuksParam> = [
376  {
377    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
378    value: huks.HuksKeyAlg.HUKS_ALG_AES,
379  }, {
380    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
381    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
382  }, {
383    tag: huks.HuksTag.HUKS_TAG_DIGEST,
384    value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
385  }, {
386    tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
387    value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128,
388  }, {
389    tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,
390    value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
391  }
392];
393
394let huksOptions: huks.HuksOptions = {
395  properties: properties,
396  inData: new Uint8Array(new Array())
397}
398
399/* 集成init时密钥参数集 */
400let initProperties: Array<huks.HuksParam> = [
401  {
402    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
403    value: huks.HuksKeyAlg.HUKS_ALG_PBKDF2,
404  }, {
405    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
406    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
407  }, {
408    tag: huks.HuksTag.HUKS_TAG_DIGEST,
409    value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
410  }, {
411    tag: huks.HuksTag.HUKS_TAG_DERIVE_KEY_SIZE,
412    value: derivedKeySize,
413  }, {
414    tag: huks.HuksTag.HUKS_TAG_ITERATION,
415    value: iterationCount,
416  }, {
417    tag: huks.HuksTag.HUKS_TAG_SALT,
418    value: StringToUint8Array(salt),
419  }
420];
421
422let initOptions: huks.HuksOptions = {
423  properties: initProperties,
424  inData: new Uint8Array(new Array())
425}
426
427/* 集成finish时密钥参数集 */
428let finishProperties: Array<huks.HuksParam> = [
429  {
430    tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,
431    value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
432  }, {
433    tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS,
434    value: true,
435  }, {
436    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
437    value: huks.HuksKeyAlg.HUKS_ALG_AES,
438  }, {
439    tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
440    value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256,
441  }, {
442    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
443    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT,
444  }, {
445    tag: huks.HuksTag.HUKS_TAG_DIGEST,
446    value: huks.HuksKeyDigest.HUKS_DIGEST_NONE,
447  }, {
448    tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS,
449    value: StringToUint8Array(srcKeyAlias),
450  }, {
451    tag: huks.HuksTag.HUKS_TAG_PADDING,
452    value: huks.HuksKeyPadding.HUKS_PADDING_NONE,
453  }, {
454    tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,
455    value: huks.HuksCipherMode.HUKS_MODE_ECB,
456  }
457];
458
459let finishOptions: huks.HuksOptions = {
460  properties: finishProperties,
461  inData: new Uint8Array(new Array())
462}
463
464function StringToUint8Array(str: String) {
465  let arr: number[] = new Array();
466  for (let i = 0, j = str.length; i < j; ++i) {
467    arr.push(str.charCodeAt(i));
468  }
469  return new Uint8Array(arr);
470}
471
472class throwObject {
473  isThrow = false;
474}
475
476function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
477  return new Promise<void>((resolve, reject) => {
478    try {
479      huks.generateKeyItem(keyAlias, huksOptions, (error, data) => {
480        if (error) {
481          reject(error);
482        } else {
483          resolve(data);
484        }
485      });
486    } catch (error) {
487      throwObject.isThrow = true;
488      throw (error as Error);
489    }
490  });
491}
492
493async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
494  console.info(`enter promise generateKeyItem`);
495  let throwObject: throwObject = { isThrow: false };
496  try {
497    await generateKeyItem(keyAlias, huksOptions, throwObject)
498      .then((data) => {
499        console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`);
500      })
501      .catch((error: Error) => {
502        if (throwObject.isThrow) {
503          throw (error as Error);
504        } else {
505          console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`);
506        }
507      });
508  } catch (error) {
509    console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`);
510  }
511}
512
513function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
514  return new Promise<huks.HuksSessionHandle>((resolve, reject) => {
515    try {
516      huks.initSession(keyAlias, huksOptions, (error, data) => {
517        if (error) {
518          reject(error);
519        } else {
520          resolve(data);
521        }
522      });
523    } catch (error) {
524      throwObject.isThrow = true;
525      throw (error as Error);
526    }
527  });
528}
529
530async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
531  console.info(`enter promise doInit`);
532  let throwObject: throwObject = { isThrow: false };
533  try {
534    await initSession(keyAlias, huksOptions, throwObject)
535      .then((data) => {
536        console.info(`promise: doInit success, data = ${JSON.stringify(data)}`);
537        handle = data.handle;
538      })
539      .catch((error: Error) => {
540        if (throwObject.isThrow) {
541          throw (error as Error);
542        } else {
543          console.error(`promise: doInit failed, ${JSON.stringify(error)}`);
544        }
545      });
546  } catch (error) {
547    console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`);
548  }
549}
550
551function updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {
552  return new Promise<huks.HuksOptions>((resolve, reject) => {
553    try {
554      huks.updateSession(handle, huksOptions, (error, data) => {
555        if (error) {
556          reject(error);
557        } else {
558          resolve(data);
559        }
560      });
561    } catch (error) {
562      throwObject.isThrow = true;
563      throw (error as Error);
564    }
565  });
566}
567
568async function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) {
569  console.info(`enter promise doUpdate`);
570  let throwObject: throwObject = { isThrow: false };
571  try {
572    await updateSession(handle, huksOptions, throwObject)
573      .then((data) => {
574        console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`);
575      })
576      .catch((error: Error) => {
577        if (throwObject.isThrow) {
578          throw (error as Error);
579        } else {
580          console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`);
581        }
582      });
583  } catch (error) {
584    console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`);
585  }
586}
587
588function finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {
589  return new Promise<huks.HuksReturnResult>((resolve, reject) => {
590    try {
591      huks.finishSession(handle, huksOptions, (error, data) => {
592        if (error) {
593          reject(error);
594        } else {
595          resolve(data);
596        }
597      });
598    } catch (error) {
599      throwObject.isThrow = true;
600      throw (error as Error);
601    }
602  });
603}
604
605async function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) {
606  console.info(`enter promise doFinish`);
607  let throwObject: throwObject = { isThrow: false };
608  try {
609    await finishSession(handle, huksOptions, throwObject)
610      .then((data) => {
611        finishOutData = data.outData as Uint8Array;
612        console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`);
613      })
614      .catch((error: Error) => {
615        if (throwObject.isThrow) {
616          throw (error as Error);
617        } else {
618          console.error(`promise: doFinish failed, ${JSON.stringify(error)}`);
619        }
620      });
621  } catch (error) {
622    console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`);
623  }
624}
625
626function deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
627  return new Promise<void>((resolve, reject) => {
628    try {
629      huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => {
630        if (error) {
631          reject(error);
632        } else {
633          resolve(data);
634        }
635      });
636    } catch (error) {
637      throwObject.isThrow = true;
638      throw (error as Error);
639    }
640  });
641}
642
643async function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
644  console.info(`enter promise deleteKeyItem`);
645  let throwObject: throwObject = { isThrow: false };
646  try {
647    await deleteKeyItem(keyAlias, huksOptions, throwObject)
648      .then((data) => {
649        console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`);
650      })
651      .catch((error: Error) => {
652        if (throwObject.isThrow) {
653          throw (error as Error);
654        } else {
655          console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`);
656        }
657      });
658  } catch (error) {
659    console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`);
660  }
661}
662
663async function testDerive() {
664  /* 生成密钥 */
665  await publicGenKeyFunc(srcKeyAlias, huksOptions);
666  /* 进行派生操作 */
667  await publicInitFunc(srcKeyAlias, initOptions);
668  initOptions.inData = StringToUint8Array(password);
669  await publicUpdateFunc(handle, initOptions);
670  await publicFinishFunc(handle, finishOptions);
671  await publicDeleteKeyFunc(srcKeyAlias, huksOptions);
672}
673```