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