1# 密钥派生(ArkTS) 2 3 4以HKDF256密钥为例,完成密钥派生。具体的场景介绍及支持的算法规格,请参考[密钥生成支持的算法](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 salt = "mySalt"; 368let iterationCount = 10000; 369let derivedKeySize = 32; 370let handle: number; 371let finishOutData: Uint8Array; 372 373/* 集成生成密钥参数集 */ 374let properties: Array<huks.HuksParam> = [ 375 { 376 tag: huks.HuksTag.HUKS_TAG_ALGORITHM, 377 value: huks.HuksKeyAlg.HUKS_ALG_AES, 378 }, { 379 tag: huks.HuksTag.HUKS_TAG_PURPOSE, 380 value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE, 381 }, { 382 tag: huks.HuksTag.HUKS_TAG_DIGEST, 383 value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256, 384 }, { 385 tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, 386 value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_128, 387 }, { 388 tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, 389 value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, 390 } 391]; 392 393let huksOptions: huks.HuksOptions = { 394 properties: properties, 395 inData: new Uint8Array(new Array()) 396} 397 398/* 集成init时密钥参数集 */ 399let initProperties: Array<huks.HuksParam> = [ 400 { 401 tag: huks.HuksTag.HUKS_TAG_ALGORITHM, 402 value: huks.HuksKeyAlg.HUKS_ALG_PBKDF2, 403 }, { 404 tag: huks.HuksTag.HUKS_TAG_PURPOSE, 405 value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DERIVE, 406 }, { 407 tag: huks.HuksTag.HUKS_TAG_DIGEST, 408 value: huks.HuksKeyDigest.HUKS_DIGEST_SHA256, 409 }, { 410 tag: huks.HuksTag.HUKS_TAG_DERIVE_KEY_SIZE, 411 value: derivedKeySize, 412 }, { 413 tag: huks.HuksTag.HUKS_TAG_ITERATION, 414 value: iterationCount, 415 }, { 416 tag: huks.HuksTag.HUKS_TAG_SALT, 417 value: StringToUint8Array(salt), 418 } 419]; 420 421let initOptions: huks.HuksOptions = { 422 properties: initProperties, 423 inData: new Uint8Array(new Array()) 424} 425 426/* 集成finish时密钥参数集 */ 427let finishProperties: Array<huks.HuksParam> = [ 428 { 429 tag: huks.HuksTag.HUKS_TAG_DERIVED_AGREED_KEY_STORAGE_FLAG, 430 value: huks.HuksKeyStorageType.HUKS_STORAGE_ONLY_USED_IN_HUKS, 431 }, { 432 tag: huks.HuksTag.HUKS_TAG_IS_KEY_ALIAS, 433 value: true, 434 }, { 435 tag: huks.HuksTag.HUKS_TAG_ALGORITHM, 436 value: huks.HuksKeyAlg.HUKS_ALG_AES, 437 }, { 438 tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, 439 value: huks.HuksKeySize.HUKS_AES_KEY_SIZE_256, 440 }, { 441 tag: huks.HuksTag.HUKS_TAG_PURPOSE, 442 value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT, 443 }, { 444 tag: huks.HuksTag.HUKS_TAG_DIGEST, 445 value: huks.HuksKeyDigest.HUKS_DIGEST_NONE, 446 }, { 447 tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS, 448 value: StringToUint8Array(srcKeyAlias), 449 }, { 450 tag: huks.HuksTag.HUKS_TAG_PADDING, 451 value: huks.HuksKeyPadding.HUKS_PADDING_NONE, 452 }, { 453 tag: huks.HuksTag.HUKS_TAG_BLOCK_MODE, 454 value: huks.HuksCipherMode.HUKS_MODE_ECB, 455 } 456]; 457 458let finishOptions: huks.HuksOptions = { 459 properties: finishProperties, 460 inData: new Uint8Array(new Array()) 461} 462 463function StringToUint8Array(str: String) { 464 let arr: number[] = new Array(); 465 for (let i = 0, j = str.length; i < j; ++i) { 466 arr.push(str.charCodeAt(i)); 467 } 468 return new Uint8Array(arr); 469} 470 471class throwObject { 472 isThrow = false; 473} 474 475function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) { 476 return new Promise<void>((resolve, reject) => { 477 try { 478 huks.generateKeyItem(keyAlias, huksOptions, (error, data) => { 479 if (error) { 480 reject(error); 481 } else { 482 resolve(data); 483 } 484 }); 485 } catch (error) { 486 throwObject.isThrow = true; 487 throw (error as Error); 488 } 489 }); 490} 491 492async function publicGenKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { 493 console.info(`enter promise generateKeyItem`); 494 let throwObject: throwObject = { isThrow: false }; 495 try { 496 await generateKeyItem(keyAlias, huksOptions, throwObject) 497 .then((data) => { 498 console.info(`promise: generateKeyItem success, data = ${JSON.stringify(data)}`); 499 }) 500 .catch((error: Error) => { 501 if (throwObject.isThrow) { 502 throw (error as Error); 503 } else { 504 console.error(`promise: generateKeyItem failed, ${JSON.stringify(error)}`); 505 } 506 }); 507 } catch (error) { 508 console.error(`promise: generateKeyItem input arg invalid, ${JSON.stringify(error)}`); 509 } 510} 511 512function initSession(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) { 513 return new Promise<huks.HuksSessionHandle>((resolve, reject) => { 514 try { 515 huks.initSession(keyAlias, huksOptions, (error, data) => { 516 if (error) { 517 reject(error); 518 } else { 519 resolve(data); 520 } 521 }); 522 } catch (error) { 523 throwObject.isThrow = true; 524 throw (error as Error); 525 } 526 }); 527} 528 529async function publicInitFunc(keyAlias: string, huksOptions: huks.HuksOptions) { 530 console.info(`enter promise doInit`); 531 let throwObject: throwObject = { isThrow: false }; 532 try { 533 await initSession(keyAlias, huksOptions, throwObject) 534 .then((data) => { 535 console.info(`promise: doInit success, data = ${JSON.stringify(data)}`); 536 handle = data.handle; 537 }) 538 .catch((error: Error) => { 539 if (throwObject.isThrow) { 540 throw (error as Error); 541 } else { 542 console.error(`promise: doInit failed, ${JSON.stringify(error)}`); 543 } 544 }); 545 } catch (error) { 546 console.error(`promise: doInit input arg invalid, ${JSON.stringify(error)}`); 547 } 548} 549 550function updateSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) { 551 return new Promise<huks.HuksOptions>((resolve, reject) => { 552 try { 553 huks.updateSession(handle, huksOptions, (error, data) => { 554 if (error) { 555 reject(error); 556 } else { 557 resolve(data); 558 } 559 }); 560 } catch (error) { 561 throwObject.isThrow = true; 562 throw (error as Error); 563 } 564 }); 565} 566 567async function publicUpdateFunc(handle: number, huksOptions: huks.HuksOptions) { 568 console.info(`enter promise doUpdate`); 569 let throwObject: throwObject = { isThrow: false }; 570 try { 571 await updateSession(handle, huksOptions, throwObject) 572 .then((data) => { 573 console.info(`promise: doUpdate success, data = ${JSON.stringify(data)}`); 574 }) 575 .catch((error: Error) => { 576 if (throwObject.isThrow) { 577 throw (error as Error); 578 } else { 579 console.error(`promise: doUpdate failed, ${JSON.stringify(error)}`); 580 } 581 }); 582 } catch (error) { 583 console.error(`promise: doUpdate input arg invalid, ${JSON.stringify(error)}`); 584 } 585} 586 587function finishSession(handle: number, huksOptions: huks.HuksOptions, throwObject: throwObject) { 588 return new Promise<huks.HuksReturnResult>((resolve, reject) => { 589 try { 590 huks.finishSession(handle, huksOptions, (error, data) => { 591 if (error) { 592 reject(error); 593 } else { 594 resolve(data); 595 } 596 }); 597 } catch (error) { 598 throwObject.isThrow = true; 599 throw (error as Error); 600 } 601 }); 602} 603 604async function publicFinishFunc(handle: number, huksOptions: huks.HuksOptions) { 605 console.info(`enter promise doFinish`); 606 let throwObject: throwObject = { isThrow: false }; 607 try { 608 await finishSession(handle, huksOptions, throwObject) 609 .then((data) => { 610 finishOutData = data.outData as Uint8Array; 611 console.info(`promise: doFinish success, data = ${JSON.stringify(data)}`); 612 }) 613 .catch((error: Error) => { 614 if (throwObject.isThrow) { 615 throw (error as Error); 616 } else { 617 console.error(`promise: doFinish failed, ${JSON.stringify(error)}`); 618 } 619 }); 620 } catch (error) { 621 console.error(`promise: doFinish input arg invalid, ${JSON.stringify(error)}`); 622 } 623} 624 625function deleteKeyItem(keyAlias: string, huksOptions: huks.HuksOptions, throwObject: throwObject) { 626 return new Promise<void>((resolve, reject) => { 627 try { 628 huks.deleteKeyItem(keyAlias, huksOptions, (error, data) => { 629 if (error) { 630 reject(error); 631 } else { 632 resolve(data); 633 } 634 }); 635 } catch (error) { 636 throwObject.isThrow = true; 637 throw (error as Error); 638 } 639 }); 640} 641 642async function publicDeleteKeyFunc(keyAlias: string, huksOptions: huks.HuksOptions) { 643 console.info(`enter promise deleteKeyItem`); 644 let throwObject: throwObject = { isThrow: false }; 645 try { 646 await deleteKeyItem(keyAlias, huksOptions, throwObject) 647 .then((data) => { 648 console.info(`promise: deleteKeyItem key success, data = ${JSON.stringify(data)}`); 649 }) 650 .catch((error: Error) => { 651 if (throwObject.isThrow) { 652 throw (error as Error); 653 } else { 654 console.error(`promise: deleteKeyItem failed, ${JSON.stringify(error)}`); 655 } 656 }); 657 } catch (error) { 658 console.error(`promise: deleteKeyItem input arg invalid, ${JSON.stringify(error)}`); 659 } 660} 661 662async function testDerive() { 663 /* 生成密钥 */ 664 await publicGenKeyFunc(srcKeyAlias, huksOptions); 665 /* 进行派生操作 */ 666 await publicInitFunc(srcKeyAlias, initOptions); 667 await publicUpdateFunc(handle, initOptions); 668 await publicFinishFunc(handle, finishOptions); 669 await publicDeleteKeyFunc(srcKeyAlias, huksOptions); 670} 671```