1e41f4b71Sopenharmony_ci# Key Derivation (ArkTS)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciThis topic walks you through on how to derive a 256-bit key using HKDF. For details about the scenarios and supported algorithms, see [Supported Algorithms](huks-key-generation-overview.md#supported-algorithms).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ci## How to Develop
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci**Key Generation**
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci1. Set the key alias.
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci2. 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.
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci    - 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.
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci    - 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.
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci    - 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.
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci3. 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).
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ciAlternatively, you can [import a key](huks-key-import-overview.md).
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci**Key Derivation**
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci1. Obtain the key alias and set the **HuksOptions** parameter.
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci    You can set **HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG** to specify how the derived key is managed.
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci    | Key Generation| Key Derivation| Specifications|
32e41f4b71Sopenharmony_ci    | -------- | -------- | -------- |
33e41f4b71Sopenharmony_ci    | HUKS_STORAGE_ONLY_USED_IN_HUKS | HUKS_STORAGE_ONLY_USED_IN_HUKS | The key is managed by HUKS.|
34e41f4b71Sopenharmony_ci    | HUKS_STORAGE_KEY_EXPORT_ALLOWED | HUKS_STORAGE_KEY_EXPORT_ALLOWED | The key is returned to the caller for management.|
35e41f4b71Sopenharmony_ci    | The tag is not set.| HUKS_STORAGE_ONLY_USED_IN_HUKS | The key is managed by HUKS.|
36e41f4b71Sopenharmony_ci    | The tag is not set.| HUKS_STORAGE_KEY_EXPORT_ALLOWED | The key is returned to the caller for management.|
37e41f4b71Sopenharmony_ci    | The tag is not set.| The tag is not set.| The key is returned to the caller for management.|
38e41f4b71Sopenharmony_ci
39e41f4b71Sopenharmony_ci    >**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.
40e41f4b71Sopenharmony_ci
41e41f4b71Sopenharmony_ci
42e41f4b71Sopenharmony_ci2. 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.
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci3. Use [updateSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksupdatesession9) to process data.
45e41f4b71Sopenharmony_ci
46e41f4b71Sopenharmony_ci4. Use [OH_Huks_FinishSession](../../reference/apis-universal-keystore-kit/_huks_key_api.md#oh_huks_finishsession) to derive a key.
47e41f4b71Sopenharmony_ci
48e41f4b71Sopenharmony_ci**Key Deletion**
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ciUse [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).
51e41f4b71Sopenharmony_ci## Development Cases
52e41f4b71Sopenharmony_ci### HKDF
53e41f4b71Sopenharmony_ci```ts
54e41f4b71Sopenharmony_ci/*
55e41f4b71Sopenharmony_ci * Derive an HKDF key using promise-based APIs.
56e41f4b71Sopenharmony_ci */
57e41f4b71Sopenharmony_ciimport { huks } from '@kit.UniversalKeystoreKit';
58e41f4b71Sopenharmony_ci
59e41f4b71Sopenharmony_ci/*
60e41f4b71Sopenharmony_ci * Set the key alias and encapsulate the key property set.
61e41f4b71Sopenharmony_ci */
62e41f4b71Sopenharmony_cilet srcKeyAlias = "hkdf_Key";
63e41f4b71Sopenharmony_cilet deriveHkdfInData = "deriveHkdfTestIndata";
64e41f4b71Sopenharmony_cilet handle: number;
65e41f4b71Sopenharmony_cilet finishOutData: Uint8Array;
66e41f4b71Sopenharmony_cilet HuksKeyDeriveKeySize = 32;
67e41f4b71Sopenharmony_ci/* Set the parameter set used for key generation. */
68e41f4b71Sopenharmony_cilet properties: Array<huks.HuksParam> = [
69e41f4b71Sopenharmony_ci  {
70e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
71e41f4b71Sopenharmony_ci    value: huks.HuksKeyAlg.HUKS_ALG_AES,
72e41f4b71Sopenharmony_ci  }, {
73e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_PURPOSE,
74e41f4b71Sopenharmony_ci  value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
75e41f4b71Sopenharmony_ci}, {
76e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_DIGEST,
77e41f4b71Sopenharmony_ci  value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
78e41f4b71Sopenharmony_ci}, {
79e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
80e41f4b71Sopenharmony_ci  value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128,
81e41f4b71Sopenharmony_ci}, {
82e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,
83e41f4b71Sopenharmony_ci  value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
84e41f4b71Sopenharmony_ci}];
85e41f4b71Sopenharmony_ci
86e41f4b71Sopenharmony_cilet huksOptions: huks.HuksOptions = {
87e41f4b71Sopenharmony_ci  properties: properties,
88e41f4b71Sopenharmony_ci  inData: new Uint8Array(new Array())
89e41f4b71Sopenharmony_ci}
90e41f4b71Sopenharmony_ci/* Set the parameter set used for init(). */
91e41f4b71Sopenharmony_cilet initProperties: Array<huks.HuksParam> = [{
92e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
93e41f4b71Sopenharmony_ci  value: huks.HuksKeyAlg.HUKS_ALG_HKDF,
94e41f4b71Sopenharmony_ci}, {
95e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_PURPOSE,
96e41f4b71Sopenharmony_ci  value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
97e41f4b71Sopenharmony_ci}, {
98e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_DIGEST,
99e41f4b71Sopenharmony_ci  value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
100e41f4b71Sopenharmony_ci}, {
101e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_DERIVE_KEY_SIZE,
102e41f4b71Sopenharmony_ci  value: HuksKeyDeriveKeySize,
103e41f4b71Sopenharmony_ci}];
104e41f4b71Sopenharmony_ci
105e41f4b71Sopenharmony_cilet initOptions: huks.HuksOptions = {
106e41f4b71Sopenharmony_ci  properties: initProperties,
107e41f4b71Sopenharmony_ci  inData: new Uint8Array(new Array())
108e41f4b71Sopenharmony_ci}
109e41f4b71Sopenharmony_ci/* Set the parameter set used for finish(). */
110e41f4b71Sopenharmony_cilet finishProperties: Array<huks.HuksParam> = [{
111e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,
112e41f4b71Sopenharmony_ci  value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
113e41f4b71Sopenharmony_ci}, {
114e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS,
115e41f4b71Sopenharmony_ci  value: true,
116e41f4b71Sopenharmony_ci}, {
117e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
118e41f4b71Sopenharmony_ci  value: huks.HuksKeyAlg.HUKS_ALG_AES,
119e41f4b71Sopenharmony_ci}, {
120e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
121e41f4b71Sopenharmony_ci  value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256,
122e41f4b71Sopenharmony_ci}, {
123e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_PURPOSE,
124e41f4b71Sopenharmony_ci  value:
125e41f4b71Sopenharmony_ci  huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT |
126e41f4b71Sopenharmony_ci  huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT,
127e41f4b71Sopenharmony_ci}, {
128e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_DIGEST,
129e41f4b71Sopenharmony_ci  value: huks.HuksKeyDigest.HUKS_DIGEST_NONE,
130e41f4b71Sopenharmony_ci}, {
131e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS,
132e41f4b71Sopenharmony_ci  value: StringToUint8Array(srcKeyAlias),
133e41f4b71Sopenharmony_ci}, {
134e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_PADDING,
135e41f4b71Sopenharmony_ci  value: huks.HuksKeyPadding.HUKS_PADDING_NONE,
136e41f4b71Sopenharmony_ci}, {
137e41f4b71Sopenharmony_ci  tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,
138e41f4b71Sopenharmony_ci  value: huks.HuksCipherMode.HUKS_MODE_ECB,
139e41f4b71Sopenharmony_ci}];
140e41f4b71Sopenharmony_cilet finishOptions: huks.HuksOptions = {
141e41f4b71Sopenharmony_ci  properties: finishProperties,
142e41f4b71Sopenharmony_ci  inData: new Uint8Array(new Array())
143e41f4b71Sopenharmony_ci}
144e41f4b71Sopenharmony_ci
145e41f4b71Sopenharmony_cifunction StringToUint8Array(str: String) {
146e41f4b71Sopenharmony_ci  let arr: number[] = new Array();
147e41f4b71Sopenharmony_ci  for (let i = 0, j = str.length; i < j; ++i) {
148e41f4b71Sopenharmony_ci    arr.push(str.charCodeAt(i));
149e41f4b71Sopenharmony_ci  }
150e41f4b71Sopenharmony_ci  return new Uint8Array(arr);
151e41f4b71Sopenharmony_ci}
152e41f4b71Sopenharmony_ci
153e41f4b71Sopenharmony_ciclass throwObject {
154e41f4b71Sopenharmony_ci  isThrow = false;
155e41f4b71Sopenharmony_ci}
156e41f4b71Sopenharmony_ci
157e41f4b71Sopenharmony_cifunction generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
158e41f4b71Sopenharmony_ci  return new Promise<void>((resolve, reject) => {
159e41f4b71Sopenharmony_ci    try {
160e41f4b71Sopenharmony_ci      huks.generateKeyItem(keyAlias, huksOptions, (error, data) => {
161e41f4b71Sopenharmony_ci        if (error) {
162e41f4b71Sopenharmony_ci          reject(error);
163e41f4b71Sopenharmony_ci        } else {
164e41f4b71Sopenharmony_ci          resolve(data);
165e41f4b71Sopenharmony_ci        }
166e41f4b71Sopenharmony_ci      });
167e41f4b71Sopenharmony_ci    } catch (error) {
168e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
169e41f4b71Sopenharmony_ci      throw (error as Error);
170e41f4b71Sopenharmony_ci    }
171e41f4b71Sopenharmony_ci  });
172e41f4b71Sopenharmony_ci}
173e41f4b71Sopenharmony_ci
174e41f4b71Sopenharmony_ciasync function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
175e41f4b71Sopenharmony_ci  console.info(`enter promise generateKeyItem`);
176e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
177e41f4b71Sopenharmony_ci  try {
178e41f4b71Sopenharmony_ci    await generateKeyItem(keyAlias, huksOptions, throwObject)
179e41f4b71Sopenharmony_ci      .then((data) => {
180e41f4b71Sopenharmony_ci        console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`);
181e41f4b71Sopenharmony_ci      })
182e41f4b71Sopenharmony_ci      .catch((error: Error) => {
183e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
184e41f4b71Sopenharmony_ci          throw (error as Error);
185e41f4b71Sopenharmony_ci        } else {
186e41f4b71Sopenharmony_ci          console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`);
187e41f4b71Sopenharmony_ci        }
188e41f4b71Sopenharmony_ci      });
189e41f4b71Sopenharmony_ci  } catch (error) {
190e41f4b71Sopenharmony_ci    console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`);
191e41f4b71Sopenharmony_ci  }
192e41f4b71Sopenharmony_ci}
193e41f4b71Sopenharmony_ci
194e41f4b71Sopenharmony_cifunction initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
195e41f4b71Sopenharmony_ci  return new Promise<huks.HuksSessionHandle>((resolve, reject) => {
196e41f4b71Sopenharmony_ci    try {
197e41f4b71Sopenharmony_ci      huks.initSession(keyAlias, huksOptions, (error, data) => {
198e41f4b71Sopenharmony_ci        if (error) {
199e41f4b71Sopenharmony_ci          reject(error);
200e41f4b71Sopenharmony_ci        } else {
201e41f4b71Sopenharmony_ci          resolve(data);
202e41f4b71Sopenharmony_ci        }
203e41f4b71Sopenharmony_ci      });
204e41f4b71Sopenharmony_ci    } catch (error) {
205e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
206e41f4b71Sopenharmony_ci      throw (error as Error);
207e41f4b71Sopenharmony_ci    }
208e41f4b71Sopenharmony_ci  });
209e41f4b71Sopenharmony_ci}
210e41f4b71Sopenharmony_ci
211e41f4b71Sopenharmony_ciasync function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
212e41f4b71Sopenharmony_ci  console.info(`enter promise doInit`);
213e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
214e41f4b71Sopenharmony_ci  try {
215e41f4b71Sopenharmony_ci    await initSession(keyAlias, huksOptions, throwObject)
216e41f4b71Sopenharmony_ci      .then((data) => {
217e41f4b71Sopenharmony_ci        console.info(`promise: doInit success, data = ${JSON.stringify(data)}`);
218e41f4b71Sopenharmony_ci        handle = data.handle;
219e41f4b71Sopenharmony_ci      })
220e41f4b71Sopenharmony_ci      .catch((error: Error) => {
221e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
222e41f4b71Sopenharmony_ci          throw (error as Error);
223e41f4b71Sopenharmony_ci        } else {
224e41f4b71Sopenharmony_ci          console.error(`promise: doInit failed, ${JSON.stringify(error)}`);
225e41f4b71Sopenharmony_ci        }
226e41f4b71Sopenharmony_ci      });
227e41f4b71Sopenharmony_ci  } catch (error) {
228e41f4b71Sopenharmony_ci    console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`);
229e41f4b71Sopenharmony_ci  }
230e41f4b71Sopenharmony_ci}
231e41f4b71Sopenharmony_ci
232e41f4b71Sopenharmony_cifunction updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {
233e41f4b71Sopenharmony_ci  return new Promise<huks.HuksOptions>((resolve, reject) => {
234e41f4b71Sopenharmony_ci    try {
235e41f4b71Sopenharmony_ci      huks.updateSession(handle, huksOptions, (error, data) => {
236e41f4b71Sopenharmony_ci        if (error) {
237e41f4b71Sopenharmony_ci          reject(error);
238e41f4b71Sopenharmony_ci        } else {
239e41f4b71Sopenharmony_ci          resolve(data);
240e41f4b71Sopenharmony_ci        }
241e41f4b71Sopenharmony_ci      });
242e41f4b71Sopenharmony_ci    } catch (error) {
243e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
244e41f4b71Sopenharmony_ci      throw (error as Error);
245e41f4b71Sopenharmony_ci    }
246e41f4b71Sopenharmony_ci  });
247e41f4b71Sopenharmony_ci}
248e41f4b71Sopenharmony_ci
249e41f4b71Sopenharmony_ciasync function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) {
250e41f4b71Sopenharmony_ci  console.info(`enter promise doUpdate`);
251e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
252e41f4b71Sopenharmony_ci  try {
253e41f4b71Sopenharmony_ci    await updateSession(handle, huksOptions, throwObject)
254e41f4b71Sopenharmony_ci      .then((data) => {
255e41f4b71Sopenharmony_ci        console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`);
256e41f4b71Sopenharmony_ci      })
257e41f4b71Sopenharmony_ci      .catch((error: Error) => {
258e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
259e41f4b71Sopenharmony_ci          throw (error as Error);
260e41f4b71Sopenharmony_ci        } else {
261e41f4b71Sopenharmony_ci          console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`);
262e41f4b71Sopenharmony_ci        }
263e41f4b71Sopenharmony_ci      });
264e41f4b71Sopenharmony_ci  } catch (error) {
265e41f4b71Sopenharmony_ci    console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`);
266e41f4b71Sopenharmony_ci  }
267e41f4b71Sopenharmony_ci}
268e41f4b71Sopenharmony_ci
269e41f4b71Sopenharmony_cifunction finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {
270e41f4b71Sopenharmony_ci  return new Promise<huks.HuksReturnResult>((resolve, reject) => {
271e41f4b71Sopenharmony_ci    try {
272e41f4b71Sopenharmony_ci      huks.finishSession(handle, huksOptions, (error, data) => {
273e41f4b71Sopenharmony_ci        if (error) {
274e41f4b71Sopenharmony_ci          reject(error);
275e41f4b71Sopenharmony_ci        } else {
276e41f4b71Sopenharmony_ci          resolve(data);
277e41f4b71Sopenharmony_ci        }
278e41f4b71Sopenharmony_ci      });
279e41f4b71Sopenharmony_ci    } catch (error) {
280e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
281e41f4b71Sopenharmony_ci      throw (error as Error);
282e41f4b71Sopenharmony_ci    }
283e41f4b71Sopenharmony_ci  });
284e41f4b71Sopenharmony_ci}
285e41f4b71Sopenharmony_ci
286e41f4b71Sopenharmony_ciasync function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) {
287e41f4b71Sopenharmony_ci  console.info(`enter promise doFinish`);
288e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
289e41f4b71Sopenharmony_ci  try {
290e41f4b71Sopenharmony_ci    await finishSession(handle, huksOptions, throwObject)
291e41f4b71Sopenharmony_ci      .then((data) => {
292e41f4b71Sopenharmony_ci        finishOutData = data.outData as Uint8Array;
293e41f4b71Sopenharmony_ci        console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`);
294e41f4b71Sopenharmony_ci      })
295e41f4b71Sopenharmony_ci      .catch((error: Error) => {
296e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
297e41f4b71Sopenharmony_ci          throw (error as Error);
298e41f4b71Sopenharmony_ci        } else {
299e41f4b71Sopenharmony_ci          console.error(`promise: doFinish failed, ${JSON.stringify(error)}`);
300e41f4b71Sopenharmony_ci        }
301e41f4b71Sopenharmony_ci      });
302e41f4b71Sopenharmony_ci  } catch (error) {
303e41f4b71Sopenharmony_ci    console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`);
304e41f4b71Sopenharmony_ci  }
305e41f4b71Sopenharmony_ci}
306e41f4b71Sopenharmony_ci
307e41f4b71Sopenharmony_cifunction deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
308e41f4b71Sopenharmony_ci  return new Promise<void>((resolve, reject) => {
309e41f4b71Sopenharmony_ci    try {
310e41f4b71Sopenharmony_ci      huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => {
311e41f4b71Sopenharmony_ci        if (error) {
312e41f4b71Sopenharmony_ci          reject(error);
313e41f4b71Sopenharmony_ci        } else {
314e41f4b71Sopenharmony_ci          resolve(data);
315e41f4b71Sopenharmony_ci        }
316e41f4b71Sopenharmony_ci      });
317e41f4b71Sopenharmony_ci    } catch (error) {
318e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
319e41f4b71Sopenharmony_ci      throw (error as Error);
320e41f4b71Sopenharmony_ci    }
321e41f4b71Sopenharmony_ci  });
322e41f4b71Sopenharmony_ci}
323e41f4b71Sopenharmony_ci
324e41f4b71Sopenharmony_ciasync function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
325e41f4b71Sopenharmony_ci  console.info(`enter promise deleteKeyItem`);
326e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
327e41f4b71Sopenharmony_ci  try {
328e41f4b71Sopenharmony_ci    await deleteKeyItem(keyAlias, huksOptions, throwObject)
329e41f4b71Sopenharmony_ci      .then((data) => {
330e41f4b71Sopenharmony_ci        console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`);
331e41f4b71Sopenharmony_ci      })
332e41f4b71Sopenharmony_ci      .catch((error: Error) => {
333e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
334e41f4b71Sopenharmony_ci          throw (error as Error);
335e41f4b71Sopenharmony_ci        } else {
336e41f4b71Sopenharmony_ci          console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`);
337e41f4b71Sopenharmony_ci        }
338e41f4b71Sopenharmony_ci      });
339e41f4b71Sopenharmony_ci  } catch (error) {
340e41f4b71Sopenharmony_ci    console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`);
341e41f4b71Sopenharmony_ci  }
342e41f4b71Sopenharmony_ci}
343e41f4b71Sopenharmony_ci
344e41f4b71Sopenharmony_ciasync function testDerive() {
345e41f4b71Sopenharmony_ci  /* Generate a key. */
346e41f4b71Sopenharmony_ci  await publicGenKeyFunc(srcKeyAlias, huksOptions);
347e41f4b71Sopenharmony_ci  /* Perform key derivation. */
348e41f4b71Sopenharmony_ci  await publicInitFunc(srcKeyAlias, initOptions);
349e41f4b71Sopenharmony_ci  initOptions.inData = StringToUint8Array(deriveHkdfInData);
350e41f4b71Sopenharmony_ci  await publicUpdateFunc(handle, initOptions);
351e41f4b71Sopenharmony_ci  await publicFinishFunc(handle, finishOptions);
352e41f4b71Sopenharmony_ci  await publicDeleteKeyFunc(srcKeyAlias, huksOptions);
353e41f4b71Sopenharmony_ci}
354e41f4b71Sopenharmony_ci```
355e41f4b71Sopenharmony_ci### PBKDF2
356e41f4b71Sopenharmony_ci
357e41f4b71Sopenharmony_ci```ts
358e41f4b71Sopenharmony_ci/*
359e41f4b71Sopenharmony_ci * Derive a PBKDF2 key using promise-based APIs.
360e41f4b71Sopenharmony_ci */
361e41f4b71Sopenharmony_ciimport { huks } from '@kit.UniversalKeystoreKit';
362e41f4b71Sopenharmony_ci
363e41f4b71Sopenharmony_ci/*
364e41f4b71Sopenharmony_ci * Set the key alias and encapsulate the key property set.
365e41f4b71Sopenharmony_ci */
366e41f4b71Sopenharmony_cilet srcKeyAlias = "pbkdf2_Key";
367e41f4b71Sopenharmony_cilet password = "myPassword";
368e41f4b71Sopenharmony_cilet salt = "mySalt";
369e41f4b71Sopenharmony_cilet iterationCount = 10000;
370e41f4b71Sopenharmony_cilet derivedKeySize = 32;
371e41f4b71Sopenharmony_cilet handle: number;
372e41f4b71Sopenharmony_cilet finishOutData: Uint8Array;
373e41f4b71Sopenharmony_ci
374e41f4b71Sopenharmony_ci/* Set the parameter set used for key generation. */
375e41f4b71Sopenharmony_cilet properties: Array<huks.HuksParam> = [
376e41f4b71Sopenharmony_ci  {
377e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
378e41f4b71Sopenharmony_ci    value: huks.HuksKeyAlg.HUKS_ALG_AES,
379e41f4b71Sopenharmony_ci  }, {
380e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
381e41f4b71Sopenharmony_ci    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
382e41f4b71Sopenharmony_ci  }, {
383e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_DIGEST,
384e41f4b71Sopenharmony_ci    value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
385e41f4b71Sopenharmony_ci  }, {
386e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
387e41f4b71Sopenharmony_ci    value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128,
388e41f4b71Sopenharmony_ci  }, {
389e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,
390e41f4b71Sopenharmony_ci    value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
391e41f4b71Sopenharmony_ci  }
392e41f4b71Sopenharmony_ci];
393e41f4b71Sopenharmony_ci
394e41f4b71Sopenharmony_cilet huksOptions: huks.HuksOptions = {
395e41f4b71Sopenharmony_ci  properties: properties,
396e41f4b71Sopenharmony_ci  inData: new Uint8Array(new Array())
397e41f4b71Sopenharmony_ci}
398e41f4b71Sopenharmony_ci
399e41f4b71Sopenharmony_ci/* Set the parameter set used for init(). */
400e41f4b71Sopenharmony_cilet initProperties: Array<huks.HuksParam> = [
401e41f4b71Sopenharmony_ci  {
402e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
403e41f4b71Sopenharmony_ci    value: huks.HuksKeyAlg.HUKS_ALG_PBKDF2,
404e41f4b71Sopenharmony_ci  }, {
405e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
406e41f4b71Sopenharmony_ci    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE,
407e41f4b71Sopenharmony_ci  }, {
408e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_DIGEST,
409e41f4b71Sopenharmony_ci    value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256,
410e41f4b71Sopenharmony_ci  }, {
411e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_DERIVE_KEY_SIZE,
412e41f4b71Sopenharmony_ci    value: derivedKeySize,
413e41f4b71Sopenharmony_ci  }, {
414e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_ITERATION,
415e41f4b71Sopenharmony_ci    value: iterationCount,
416e41f4b71Sopenharmony_ci  }, {
417e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_SALT,
418e41f4b71Sopenharmony_ci    value: StringToUint8Array(salt),
419e41f4b71Sopenharmony_ci  }
420e41f4b71Sopenharmony_ci];
421e41f4b71Sopenharmony_ci
422e41f4b71Sopenharmony_cilet initOptions: huks.HuksOptions = {
423e41f4b71Sopenharmony_ci  properties: initProperties,
424e41f4b71Sopenharmony_ci  inData: new Uint8Array(new Array())
425e41f4b71Sopenharmony_ci}
426e41f4b71Sopenharmony_ci
427e41f4b71Sopenharmony_ci/* Set the parameter set used for finish(). */
428e41f4b71Sopenharmony_cilet finishProperties: Array<huks.HuksParam> = [
429e41f4b71Sopenharmony_ci  {
430e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG,
431e41f4b71Sopenharmony_ci    value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS,
432e41f4b71Sopenharmony_ci  }, {
433e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS,
434e41f4b71Sopenharmony_ci    value: true,
435e41f4b71Sopenharmony_ci  }, {
436e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
437e41f4b71Sopenharmony_ci    value: huks.HuksKeyAlg.HUKS_ALG_AES,
438e41f4b71Sopenharmony_ci  }, {
439e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
440e41f4b71Sopenharmony_ci    value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256,
441e41f4b71Sopenharmony_ci  }, {
442e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
443e41f4b71Sopenharmony_ci    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT,
444e41f4b71Sopenharmony_ci  }, {
445e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_DIGEST,
446e41f4b71Sopenharmony_ci    value: huks.HuksKeyDigest.HUKS_DIGEST_NONE,
447e41f4b71Sopenharmony_ci  }, {
448e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS,
449e41f4b71Sopenharmony_ci    value: StringToUint8Array(srcKeyAlias),
450e41f4b71Sopenharmony_ci  }, {
451e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_PADDING,
452e41f4b71Sopenharmony_ci    value: huks.HuksKeyPadding.HUKS_PADDING_NONE,
453e41f4b71Sopenharmony_ci  }, {
454e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE,
455e41f4b71Sopenharmony_ci    value: huks.HuksCipherMode.HUKS_MODE_ECB,
456e41f4b71Sopenharmony_ci  }
457e41f4b71Sopenharmony_ci];
458e41f4b71Sopenharmony_ci
459e41f4b71Sopenharmony_cilet finishOptions: huks.HuksOptions = {
460e41f4b71Sopenharmony_ci  properties: finishProperties,
461e41f4b71Sopenharmony_ci  inData: new Uint8Array(new Array())
462e41f4b71Sopenharmony_ci}
463e41f4b71Sopenharmony_ci
464e41f4b71Sopenharmony_cifunction StringToUint8Array(str: String) {
465e41f4b71Sopenharmony_ci  let arr: number[] = new Array();
466e41f4b71Sopenharmony_ci  for (let i = 0, j = str.length; i < j; ++i) {
467e41f4b71Sopenharmony_ci    arr.push(str.charCodeAt(i));
468e41f4b71Sopenharmony_ci  }
469e41f4b71Sopenharmony_ci  return new Uint8Array(arr);
470e41f4b71Sopenharmony_ci}
471e41f4b71Sopenharmony_ci
472e41f4b71Sopenharmony_ciclass throwObject {
473e41f4b71Sopenharmony_ci  isThrow = false;
474e41f4b71Sopenharmony_ci}
475e41f4b71Sopenharmony_ci
476e41f4b71Sopenharmony_cifunction generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
477e41f4b71Sopenharmony_ci  return new Promise<void>((resolve, reject) => {
478e41f4b71Sopenharmony_ci    try {
479e41f4b71Sopenharmony_ci      huks.generateKeyItem(keyAlias, huksOptions, (error, data) => {
480e41f4b71Sopenharmony_ci        if (error) {
481e41f4b71Sopenharmony_ci          reject(error);
482e41f4b71Sopenharmony_ci        } else {
483e41f4b71Sopenharmony_ci          resolve(data);
484e41f4b71Sopenharmony_ci        }
485e41f4b71Sopenharmony_ci      });
486e41f4b71Sopenharmony_ci    } catch (error) {
487e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
488e41f4b71Sopenharmony_ci      throw (error as Error);
489e41f4b71Sopenharmony_ci    }
490e41f4b71Sopenharmony_ci  });
491e41f4b71Sopenharmony_ci}
492e41f4b71Sopenharmony_ci
493e41f4b71Sopenharmony_ciasync function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
494e41f4b71Sopenharmony_ci  console.info(`enter promise generateKeyItem`);
495e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
496e41f4b71Sopenharmony_ci  try {
497e41f4b71Sopenharmony_ci    await generateKeyItem(keyAlias, huksOptions, throwObject)
498e41f4b71Sopenharmony_ci      .then((data) => {
499e41f4b71Sopenharmony_ci        console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`);
500e41f4b71Sopenharmony_ci      })
501e41f4b71Sopenharmony_ci      .catch((error: Error) => {
502e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
503e41f4b71Sopenharmony_ci          throw (error as Error);
504e41f4b71Sopenharmony_ci        } else {
505e41f4b71Sopenharmony_ci          console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`);
506e41f4b71Sopenharmony_ci        }
507e41f4b71Sopenharmony_ci      });
508e41f4b71Sopenharmony_ci  } catch (error) {
509e41f4b71Sopenharmony_ci    console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`);
510e41f4b71Sopenharmony_ci  }
511e41f4b71Sopenharmony_ci}
512e41f4b71Sopenharmony_ci
513e41f4b71Sopenharmony_cifunction initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
514e41f4b71Sopenharmony_ci  return new Promise<huks.HuksSessionHandle>((resolve, reject) => {
515e41f4b71Sopenharmony_ci    try {
516e41f4b71Sopenharmony_ci      huks.initSession(keyAlias, huksOptions, (error, data) => {
517e41f4b71Sopenharmony_ci        if (error) {
518e41f4b71Sopenharmony_ci          reject(error);
519e41f4b71Sopenharmony_ci        } else {
520e41f4b71Sopenharmony_ci          resolve(data);
521e41f4b71Sopenharmony_ci        }
522e41f4b71Sopenharmony_ci      });
523e41f4b71Sopenharmony_ci    } catch (error) {
524e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
525e41f4b71Sopenharmony_ci      throw (error as Error);
526e41f4b71Sopenharmony_ci    }
527e41f4b71Sopenharmony_ci  });
528e41f4b71Sopenharmony_ci}
529e41f4b71Sopenharmony_ci
530e41f4b71Sopenharmony_ciasync function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
531e41f4b71Sopenharmony_ci  console.info(`enter promise doInit`);
532e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
533e41f4b71Sopenharmony_ci  try {
534e41f4b71Sopenharmony_ci    await initSession(keyAlias, huksOptions, throwObject)
535e41f4b71Sopenharmony_ci      .then((data) => {
536e41f4b71Sopenharmony_ci        console.info(`promise: doInit success, data = ${JSON.stringify(data)}`);
537e41f4b71Sopenharmony_ci        handle = data.handle;
538e41f4b71Sopenharmony_ci      })
539e41f4b71Sopenharmony_ci      .catch((error: Error) => {
540e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
541e41f4b71Sopenharmony_ci          throw (error as Error);
542e41f4b71Sopenharmony_ci        } else {
543e41f4b71Sopenharmony_ci          console.error(`promise: doInit failed, ${JSON.stringify(error)}`);
544e41f4b71Sopenharmony_ci        }
545e41f4b71Sopenharmony_ci      });
546e41f4b71Sopenharmony_ci  } catch (error) {
547e41f4b71Sopenharmony_ci    console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`);
548e41f4b71Sopenharmony_ci  }
549e41f4b71Sopenharmony_ci}
550e41f4b71Sopenharmony_ci
551e41f4b71Sopenharmony_cifunction updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {
552e41f4b71Sopenharmony_ci  return new Promise<huks.HuksOptions>((resolve, reject) => {
553e41f4b71Sopenharmony_ci    try {
554e41f4b71Sopenharmony_ci      huks.updateSession(handle, huksOptions, (error, data) => {
555e41f4b71Sopenharmony_ci        if (error) {
556e41f4b71Sopenharmony_ci          reject(error);
557e41f4b71Sopenharmony_ci        } else {
558e41f4b71Sopenharmony_ci          resolve(data);
559e41f4b71Sopenharmony_ci        }
560e41f4b71Sopenharmony_ci      });
561e41f4b71Sopenharmony_ci    } catch (error) {
562e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
563e41f4b71Sopenharmony_ci      throw (error as Error);
564e41f4b71Sopenharmony_ci    }
565e41f4b71Sopenharmony_ci  });
566e41f4b71Sopenharmony_ci}
567e41f4b71Sopenharmony_ci
568e41f4b71Sopenharmony_ciasync function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) {
569e41f4b71Sopenharmony_ci  console.info(`enter promise doUpdate`);
570e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
571e41f4b71Sopenharmony_ci  try {
572e41f4b71Sopenharmony_ci    await updateSession(handle, huksOptions, throwObject)
573e41f4b71Sopenharmony_ci      .then((data) => {
574e41f4b71Sopenharmony_ci        console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`);
575e41f4b71Sopenharmony_ci      })
576e41f4b71Sopenharmony_ci      .catch((error: Error) => {
577e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
578e41f4b71Sopenharmony_ci          throw (error as Error);
579e41f4b71Sopenharmony_ci        } else {
580e41f4b71Sopenharmony_ci          console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`);
581e41f4b71Sopenharmony_ci        }
582e41f4b71Sopenharmony_ci      });
583e41f4b71Sopenharmony_ci  } catch (error) {
584e41f4b71Sopenharmony_ci    console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`);
585e41f4b71Sopenharmony_ci  }
586e41f4b71Sopenharmony_ci}
587e41f4b71Sopenharmony_ci
588e41f4b71Sopenharmony_cifunction finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) {
589e41f4b71Sopenharmony_ci  return new Promise<huks.HuksReturnResult>((resolve, reject) => {
590e41f4b71Sopenharmony_ci    try {
591e41f4b71Sopenharmony_ci      huks.finishSession(handle, huksOptions, (error, data) => {
592e41f4b71Sopenharmony_ci        if (error) {
593e41f4b71Sopenharmony_ci          reject(error);
594e41f4b71Sopenharmony_ci        } else {
595e41f4b71Sopenharmony_ci          resolve(data);
596e41f4b71Sopenharmony_ci        }
597e41f4b71Sopenharmony_ci      });
598e41f4b71Sopenharmony_ci    } catch (error) {
599e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
600e41f4b71Sopenharmony_ci      throw (error as Error);
601e41f4b71Sopenharmony_ci    }
602e41f4b71Sopenharmony_ci  });
603e41f4b71Sopenharmony_ci}
604e41f4b71Sopenharmony_ci
605e41f4b71Sopenharmony_ciasync function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) {
606e41f4b71Sopenharmony_ci  console.info(`enter promise doFinish`);
607e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
608e41f4b71Sopenharmony_ci  try {
609e41f4b71Sopenharmony_ci    await finishSession(handle, huksOptions, throwObject)
610e41f4b71Sopenharmony_ci      .then((data) => {
611e41f4b71Sopenharmony_ci        finishOutData = data.outData as Uint8Array;
612e41f4b71Sopenharmony_ci        console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`);
613e41f4b71Sopenharmony_ci      })
614e41f4b71Sopenharmony_ci      .catch((error: Error) => {
615e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
616e41f4b71Sopenharmony_ci          throw (error as Error);
617e41f4b71Sopenharmony_ci        } else {
618e41f4b71Sopenharmony_ci          console.error(`promise: doFinish failed, ${JSON.stringify(error)}`);
619e41f4b71Sopenharmony_ci        }
620e41f4b71Sopenharmony_ci      });
621e41f4b71Sopenharmony_ci  } catch (error) {
622e41f4b71Sopenharmony_ci    console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`);
623e41f4b71Sopenharmony_ci  }
624e41f4b71Sopenharmony_ci}
625e41f4b71Sopenharmony_ci
626e41f4b71Sopenharmony_cifunction deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) {
627e41f4b71Sopenharmony_ci  return new Promise<void>((resolve, reject) => {
628e41f4b71Sopenharmony_ci    try {
629e41f4b71Sopenharmony_ci      huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => {
630e41f4b71Sopenharmony_ci        if (error) {
631e41f4b71Sopenharmony_ci          reject(error);
632e41f4b71Sopenharmony_ci        } else {
633e41f4b71Sopenharmony_ci          resolve(data);
634e41f4b71Sopenharmony_ci        }
635e41f4b71Sopenharmony_ci      });
636e41f4b71Sopenharmony_ci    } catch (error) {
637e41f4b71Sopenharmony_ci      throwObject.isThrow = true;
638e41f4b71Sopenharmony_ci      throw (error as Error);
639e41f4b71Sopenharmony_ci    }
640e41f4b71Sopenharmony_ci  });
641e41f4b71Sopenharmony_ci}
642e41f4b71Sopenharmony_ci
643e41f4b71Sopenharmony_ciasync function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
644e41f4b71Sopenharmony_ci  console.info(`enter promise deleteKeyItem`);
645e41f4b71Sopenharmony_ci  let throwObject: throwObject = { isThrow: false };
646e41f4b71Sopenharmony_ci  try {
647e41f4b71Sopenharmony_ci    await deleteKeyItem(keyAlias, huksOptions, throwObject)
648e41f4b71Sopenharmony_ci      .then((data) => {
649e41f4b71Sopenharmony_ci        console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`);
650e41f4b71Sopenharmony_ci      })
651e41f4b71Sopenharmony_ci      .catch((error: Error) => {
652e41f4b71Sopenharmony_ci        if (throwObject.isThrow) {
653e41f4b71Sopenharmony_ci          throw (error as Error);
654e41f4b71Sopenharmony_ci        } else {
655e41f4b71Sopenharmony_ci          console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`);
656e41f4b71Sopenharmony_ci        }
657e41f4b71Sopenharmony_ci      });
658e41f4b71Sopenharmony_ci  } catch (error) {
659e41f4b71Sopenharmony_ci    console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`);
660e41f4b71Sopenharmony_ci  }
661e41f4b71Sopenharmony_ci}
662e41f4b71Sopenharmony_ci
663e41f4b71Sopenharmony_ciasync function testDerive() {
664e41f4b71Sopenharmony_ci  /* Generate a key. */
665e41f4b71Sopenharmony_ci  await publicGenKeyFunc(srcKeyAlias, huksOptions);
666e41f4b71Sopenharmony_ci  /* Perform key derivation. */
667e41f4b71Sopenharmony_ci  await publicInitFunc(srcKeyAlias, initOptions);
668e41f4b71Sopenharmony_ci  initOptions.inData = StringToUint8Array(password);
669e41f4b71Sopenharmony_ci  await publicUpdateFunc(handle, initOptions);
670e41f4b71Sopenharmony_ci  await publicFinishFunc(handle, finishOptions);
671e41f4b71Sopenharmony_ci  await publicDeleteKeyFunc(srcKeyAlias, huksOptions);
672e41f4b71Sopenharmony_ci}
673e41f4b71Sopenharmony_ci```
674