1e41f4b71Sopenharmony_ci# Generating a Key (ArkTS)
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciThis topic walks you through on how to randomly generate a DH key. For details about the scenarios and supported algorithms, see [Supported Algorithms](huks-key-generation-overview.md#supported-algorithms).
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci> **NOTE**<br>
7e41f4b71Sopenharmony_ci> Key aliases must not contain sensitive information, such as personal data.
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci## How to Develop
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci1. Set the alias (**keyAlias**) of the key to generate.
12e41f4b71Sopenharmony_ci   - The key alias cannot exceed 128 bytes.
13e41f4b71Sopenharmony_ci   - For the keys generated for different services, HUKS isolates the storage paths based on the service identity information to prevent conflicts caused by the same key alias.
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci2. Initialize the key property set. Encapsulate key properties in [HuksParam](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksparam) and use a **HuksParam** array to assign values to the **properties** field of [HuksOptions](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksoptions).
16e41f4b71Sopenharmony_ci   The key property set must contain [HuksKeyAlg](../../reference/apis-universal-keystore-kit/js-apis-huks.md#hukskeyalg), [HuksKeySize](../../reference/apis-universal-keystore-kit/js-apis-huks.md#hukskeysize), and [HuksKeyPurpose](../../reference/apis-universal-keystore-kit/js-apis-huks.md#hukskeypurpose). That is, **TAG**, **HUKS_TAG_ALGORITHM**, **HUKS_TAG_PURPOSE**, and **HUKS_TAG_KEY_SIZE** are mandatory.
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci3. Use [huks.generateKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksgeneratekeyitem9) to generate a key based on the key alias and key properties specified.
19e41f4b71Sopenharmony_ci
20e41f4b71Sopenharmony_ci> **NOTE**<br>
21e41f4b71Sopenharmony_ci> If the service uses the same key alias to call the HUKS API to generate a key again, HUKS will generate a new key and overwrite the historical key file.
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci```ts
25e41f4b71Sopenharmony_ci/* Generate a DH key. */
26e41f4b71Sopenharmony_ciimport { huks } from '@kit.UniversalKeystoreKit';
27e41f4b71Sopenharmony_ci
28e41f4b71Sopenharmony_ci/* 1. Set the key alias. */
29e41f4b71Sopenharmony_cilet keyAlias = 'dh_key';
30e41f4b71Sopenharmony_ci/* 2. Initialize the key property set. */
31e41f4b71Sopenharmony_cilet properties1: Array<huks.HuksParam> = [
32e41f4b71Sopenharmony_ci  {
33e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
34e41f4b71Sopenharmony_ci    value: huks.HuksKeyAlg.HUKS_ALG_DH
35e41f4b71Sopenharmony_ci  },
36e41f4b71Sopenharmony_ci  {
37e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
38e41f4b71Sopenharmony_ci    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE
39e41f4b71Sopenharmony_ci  },
40e41f4b71Sopenharmony_ci  {
41e41f4b71Sopenharmony_ci    tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
42e41f4b71Sopenharmony_ci    value: huks.HuksKeySize.HUKS_DH_KEY_SIZE_2048
43e41f4b71Sopenharmony_ci  }
44e41f4b71Sopenharmony_ci];
45e41f4b71Sopenharmony_cilet huksOptions: huks.HuksOptions = {
46e41f4b71Sopenharmony_ci  properties: properties1,
47e41f4b71Sopenharmony_ci  inData: new Uint8Array(new Array())
48e41f4b71Sopenharmony_ci}
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci/* 3. Generate a key. */
51e41f4b71Sopenharmony_cifunction generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions) {
52e41f4b71Sopenharmony_ci  return new Promise<void>((resolve, reject) => {
53e41f4b71Sopenharmony_ci    try {
54e41f4b71Sopenharmony_ci      huks.generateKeyItem(keyAlias, huksOptions, (error, data) => {
55e41f4b71Sopenharmony_ci        if (error) {
56e41f4b71Sopenharmony_ci          reject(error);
57e41f4b71Sopenharmony_ci        } else {
58e41f4b71Sopenharmony_ci          resolve(data);
59e41f4b71Sopenharmony_ci        }
60e41f4b71Sopenharmony_ci      });
61e41f4b71Sopenharmony_ci    } catch (error) {
62e41f4b71Sopenharmony_ci      throw (error as Error);
63e41f4b71Sopenharmony_ci    }
64e41f4b71Sopenharmony_ci  });
65e41f4b71Sopenharmony_ci}
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ciasync function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) {
68e41f4b71Sopenharmony_ci  console.info(`enter promise generateKeyItem`);
69e41f4b71Sopenharmony_ci  try {
70e41f4b71Sopenharmony_ci    await generateKeyItem(keyAlias, huksOptions)
71e41f4b71Sopenharmony_ci      .then((data) => {
72e41f4b71Sopenharmony_ci        console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`);
73e41f4b71Sopenharmony_ci      })
74e41f4b71Sopenharmony_ci      .catch((error: Error) => {
75e41f4b71Sopenharmony_ci        console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`);
76e41f4b71Sopenharmony_ci      });
77e41f4b71Sopenharmony_ci  } catch (error) {
78e41f4b71Sopenharmony_ci    console.error(`promise: generateKeyItem input arg invalid, ` + JSON.stringify(error));
79e41f4b71Sopenharmony_ci  }
80e41f4b71Sopenharmony_ci}
81e41f4b71Sopenharmony_ci
82e41f4b71Sopenharmony_ciasync function TestGenKey() {
83e41f4b71Sopenharmony_ci  await publicGenKeyFunc(keyAlias, huksOptions);
84e41f4b71Sopenharmony_ci}
85e41f4b71Sopenharmony_ci```
86