• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 密钥导出(ArkTS)
2
3<!--Kit: Universal Keystore Kit-->
4<!--Subsystem: Security-->
5<!--Owner: @wutiantian-gitee-->
6<!--Designer: @HighLowWorld-->
7<!--Tester: @wxy1234564846-->
8<!--Adviser: @zengyawen-->
9
10业务需要获取持久化存储的非对称密钥的公钥时使用,当前支持ECC/RSA/ED25519/X25519/SM2的公钥导出。
11>**说明:**
12> <!--RP1-->轻量级设备<!--RP1End-->仅支持RSA公钥导出。
13
14## 开发步骤
15
161. 指定密钥别名,密钥别名命名规范参考[密钥生成介绍及算法规格](huks-key-generation-overview.md)。
17
182. 调用接口[exportKeyItem](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksexportkeyitem9),传入参数keyAlias和options。options为预留参数,当前可传入空。
19
203. 返回值为[HuksReturnResult](../../reference/apis-universal-keystore-kit/js-apis-huks.md#huksreturnresult9)类型对象,获取的公钥明文在outData字段中,以标准的X.509规范的DER格式封装,具体请参考[公钥材料格式](huks-concepts.md#公钥材料格式)。
21
22```ts
23import { huks } from '@kit.UniversalKeystoreKit';
24import { BusinessError } from "@kit.BasicServicesKit";
25
26function Uint8ArrayToString(fileData: Uint8Array) {
27  let dataString = '';
28  for (let i = 0; i < fileData.length; i++) {
29    dataString += String.fromCharCode(fileData[i]);
30  }
31  return dataString;
32}
33
34/* 1. 设置密钥别名 */
35let keyAlias = 'keyAlias';
36/* option对象传空 */
37let emptyOptions: huks.HuksOptions = {
38  properties: []
39};
40/* 2. 设置密钥属性 */
41let properties1: huks.HuksParam[] = [{
42    tag: huks.HuksTag.HUKS_TAG_ALGORITHM,
43    value: huks.HuksKeyAlg.HUKS_ALG_DH
44  }, {
45    tag: huks.HuksTag.HUKS_TAG_PURPOSE,
46    value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_AGREE
47  }, {
48    tag: huks.HuksTag.HUKS_TAG_KEY_SIZE,
49    value: huks.HuksKeySize.HUKS_DH_KEY_SIZE_2048
50  }
51];
52let huksOptions: huks.HuksOptions = {
53  properties: properties1,
54  inData: new Uint8Array([])
55}
56
57/* 3.生成密钥 */
58async function generateKeyItem(keyAlias: string, huksOptions: huks.HuksOptions): Promise<boolean> {
59  console.info(`enter promise generateKeyItem`);
60  let ret: boolean = false;
61  try {
62    await huks.generateKeyItem(keyAlias, huksOptions)
63      .then(() => {
64        console.info(`promise: generateKeyItem success`);
65        ret = true;
66      }).catch((error: BusinessError) => {
67        console.error(`promise: generateKeyItem failed, errCode : ${error.code}, errMag : ${error.message}`);
68      });
69  } catch (error) {
70    console.error(`promise: generateKeyItem input arg invalid`);
71  }
72  return ret;
73}
74
75/* 4.导出密钥 */
76async function exportKeyItem(keyAlias: string, emptyOptions: huks.HuksOptions): Promise<boolean> {
77  console.info(`enter promise exportKeyItem`);
78  let ret: boolean = false;
79  try {
80    await huks.exportKeyItem(keyAlias, emptyOptions)
81      .then((data) => {
82        console.info(`promise: exportKeyItem success, data is ` + Uint8ArrayToString(data.outData as Uint8Array));
83        ret = true;
84      }).catch((error: BusinessError) => {
85        console.error(`promise: exportKeyItem failed, errCode : ${error.code}, errMag : ${error.message}`);
86      });
87  } catch (error) {
88    console.error(`promise: exportKeyItem input arg invalid`);
89  }
90  return ret;
91}
92
93async function testExportKeyItem() {
94  let retGen = await generateKeyItem(keyAlias, huksOptions);
95  if (retGen == false) {
96    console.error(`generateKeyItem failed`);
97    return;
98  }
99
100  let retExp = await exportKeyItem(keyAlias, emptyOptions);
101  if (retExp == false) {
102    console.error(`exportKeyItem failed`);
103    return;
104  }
105  console.info(`testExportKeyItem success`);
106}
107```