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