1# 密钥派生(ArkTS) 2 3 4以HKDF和PBKDF为例,完成密钥派生。具体的场景介绍及支持的算法规格,请参考[密钥生成支持的算法](huks-key-generation-overview.md#支持的算法)。 5 6 7## 开发步骤 8 9**生成密钥** 10 111. 指定密钥别名。 12 132. 初始化密钥属性集,可指定参数HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG(可选),用于标识基于该密钥派生出的密钥是否由HUKS管理。 14 15 - 当TAG设置为HUKS_STORAGE_ONLY_USED_IN_HUKS时,表示基于该密钥派生出的密钥,由HUKS管理,可保证派生密钥全生命周期不出安全环境。 16 17 - 当TAG设置为HUKS_STORAGE_KEY_EXPORT_ALLOWED时,表示基于该密钥派生出的密钥,返回给调用方管理,由业务自行保证密钥安全。 18 19 - 若业务未设置TAG的具体值,表示基于该密钥派生出的密钥,即可由HUKS管理,也可返回给调用方管理,业务可在后续派生时再选择使用何种方式保护密钥。 20 213. 调用[generateKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksgeneratekeyitem9)生成密钥,具体请参考[密钥生成](huks-key-generation-overview.md)。 22 23除此之外,开发者也可以参考[密钥导入](huks-key-import-overview.md),导入已有的密钥。 24 25**密钥派生** 26 271. 获取密钥别名,指定对应的属性参数HuksOptions。 28 29 可指定参数HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG(可选),用于标识派生得到的密钥是否由HUKS管理。 30 31 | 生成 | 派生 | 规格 | 32 | -------- | -------- | -------- | 33 | HUKS_STORAGE_ONLY_USED_IN_HUKS | HUKS_STORAGE_ONLY_USED_IN_HUKS | 密钥由HUKS管理 | 34 | HUKS_STORAGE_KEY_EXPORT_ALLOWED | HUKS_STORAGE_KEY_EXPORT_ALLOWED | 密钥返回给调用方管理 | 35 | 未指定TAG具体值 | HUKS_STORAGE_ONLY_USED_IN_HUKS | 密钥由HUKS管理 | 36 | 未指定TAG具体值 | HUKS_STORAGE_KEY_EXPORT_ALLOWED | 密钥返回给调用方管理 | 37 | 未指定TAG具体值 | 未指定TAG具体值 | 密钥返回给调用方管理 | 38 39 注:派生时指定的TAG值,不可与生成时指定的TAG值冲突。表格中仅列举有效的指定方式。 40 41 422. 调用[initSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksinitsession9)初始化密钥会话,并获取会话的句柄handle。 43 443. 调用[updateSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksupdatesession9)更新密钥会话。 45 464. 调用[finishSession](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksfinishsession9)结束密钥会话,完成派生。 47 48**删除密钥** 49 50当密钥废弃不用时,需要调用[deleteKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksdeletekeyitem9)删除密钥,具体请参考[密钥删除](huks-delete-key-arkts.md)。 51## 开发案例 52### HKDF 53```ts 54/* 55 * 以下以HKDF密钥的Promise操作使用为例 56 */ 57import { huks } from '@kit.UniversalKeystoreKit'; 58 59/* 60 * 确定密钥别名和封装密钥属性参数集 61 */ 62let srcKeyAlias = "hkdf_Key"; 63let deriveHkdfInData = "deriveHkdfTestIndata"; 64let handle: number; 65let finishOutData: Uint8Array; 66let HuksKeyDeriveKeySize = 32; 67/* 集成生成密钥参数集 */ 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/* 集成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/* 集成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 /* 生成密钥 */ 346 await publicGenKeyFunc(srcKeyAlias, huksOptions); 347 /* 进行派生操作 */ 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 * 以下以PBKDF2密钥的Promise操作使用为例 360 */ 361import { huks } from '@kit.UniversalKeystoreKit'; 362 363/* 364 * 确定密钥别名和封装密钥属性参数集 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/* 集成生成密钥参数集 */ 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/* 集成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/* 集成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 /* 生成密钥 */ 665 await publicGenKeyFunc(srcKeyAlias, huksOptions); 666 /* 进行派生操作 */ 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```