• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Key Derivation (ArkTS)
2
3
4This topic walks you through on how to derive a key using HKDF and PBKDF. For details about the scenarios and supported algorithms, see [Supported Algorithms](huks-key-generation-overview.md#supported-algorithms).
5
6
7## How to Develop
8
9**Key Generation**
10
111. Set the key alias.
12
132. Initialize the key property set. You can set **HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG** (optional) to specify how the key derived from this key is managed.
14
15    - If this tag is set to **HUKS_STORAGE_ONLY_USED_IN_HUKS**, the derived key is managed by HUKS. That is, the derived key is always in a secure environment throughout its lifecycle.
16
17    - If this tag is set to **HUKS_STORAGE_KEY_EXPORT_ALLOWED**, the derived key will be returned to the caller for management. That is, the service side ensures the key security.
18
19    - If this tag is not set, the derived key can be either managed by HUKS or returned to the caller for management. The key protection mode can be set in the subsequent key derivation on the service side.
20
213. Use [generateKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksgeneratekeyitem9) to generate a key. For details, see [Key Generation](huks-key-generation-overview.md).
22
23Alternatively, you can [import a key](huks-key-import-overview.md).
24
25**Key Derivation**
26
271. Obtain the key alias and set the **HuksOptions** parameter.
28
29    You can set **HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG** to specify how the derived key is managed.
30
31    | Key Generation| Key Derivation| Specifications|
32    | -------- | -------- | -------- |
33    | HUKS_STORAGE_ONLY_USED_IN_HUKS | HUKS_STORAGE_ONLY_USED_IN_HUKS | The key is managed by HUKS.|
34    | HUKS_STORAGE_KEY_EXPORT_ALLOWED | HUKS_STORAGE_KEY_EXPORT_ALLOWED | The key is returned to the caller for management.|
35    | The tag is not set.| HUKS_STORAGE_ONLY_USED_IN_HUKS | The key is managed by HUKS.|
36    | The tag is not set.| HUKS_STORAGE_KEY_EXPORT_ALLOWED | The key is returned to the caller for management.|
37    | The tag is not set.| The tag is not set.| The key is returned to the caller for management.|
38
39    >**NOTE**<br>The tag value set in key derivation should not conflict with the tag value set in key generation. The above table lists only valid settings.
40
41
422. Use [initSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksinitsession9) to initialize a key session. The session handle is returned after the initialization.
43
443. Use [updateSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksupdatesession9) to process data.
45
464. Use [OH_Huks_FinishSession](../../reference/apis-universal-keystore-kit/_huks_key_api.md#oh_huks_finishsession) to derive a key.
47
48**Key Deletion**
49
50Use [deleteKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksdeletekeyitem9) to delete the key that is not required. For details, see [Deleting a Key](huks-delete-key-arkts.md).
51## Development Cases
52### HKDF
53```ts
54/*
55 * Derive an HKDF key using promise-based APIs.
56 */
57import { huks } from '@kit.UniversalKeystoreKit';
58
59/*
60 * Set the key alias and encapsulate the key property set.
61 */
62let srcKeyAlias = "hkdf_Key";
63let deriveHkdfInData = "deriveHkdfTestIndata";
64let handle: number;
65let finishOutData: Uint8Array;
66let HuksKeyDeriveKeySize = 32;
67/* Set the parameter set used for key generation. */
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/* Set the parameter set used for 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/* Set the parameter set used for 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  /* Generate a key. */
346  await publicGenKeyFunc(srcKeyAlias, huksOptions);
347  /* Perform key derivation. */
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 * Derive a PBKDF2 key using promise-based APIs.
360 */
361import { huks } from '@kit.UniversalKeystoreKit';
362
363/*
364 * Set the key alias and encapsulate the key property set.
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/* Set the parameter set used for key generation. */
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/* Set the parameter set used for 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/* Set the parameter set used for 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  /* Generate a key. */
665  await publicGenKeyFunc(srcKeyAlias, huksOptions);
666  /* Perform key derivation. */
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```
674