• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.security.cryptoFramework (加解密算法库框架)
2
3<!--Kit: Crypto Architecture Kit-->
4<!--Subsystem: Security-->
5<!--Owner: @zxz--3-->
6<!--Designer: @lanming-->
7<!--Tester: @PAFT-->
8<!--Adviser: @zengyawen-->
9
10提供统一的密码算法库加解密接口,以屏蔽底层硬件和算法库。
11
12> **说明:**
13>
14> - 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
15
16## 导入模块
17
18```ts
19import { cryptoFramework } from '@kit.CryptoArchitectureKit';
20```
21
22## Result
23
24 表示执行结果的枚举。
25
26 **系统能力:** SystemCapability.Security.CryptoFramework
27
28| 名称                                  |    值   |   说明                         |
29| ------------------------------------- | -------- | ---------------------------- |
30| INVALID_PARAMS                        | 401      | 非法入参。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                 |
31| NOT_SUPPORT                           | 801      | 操作不支持。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。                 |
32| ERR_OUT_OF_MEMORY                     | 17620001 | 内存错误。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                   |
33| ERR_RUNTIME_ERROR                     | 17620002 | 运行时外部错误。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。           |
34| ERR_PARAMETER_CHECK_FAILED<sup>20+</sup>            | 17620003 | 表示参数检查失败。<br>**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。           |
35| ERR_CRYPTO_OPERATION                  | 17630001 | 调用三方算法库API出错。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。     |
36
37## DataBlob
38
39buffer数组,提供blob数据类型。
40
41 **原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
42
43 **系统能力:** SystemCapability.Security.CryptoFramework
44
45| 名称 | 类型       | 只读 | 可选 | 说明   |
46| ---- | ---------- | ---- | ---- | ------ |
47| data | Uint8Array | 否   | 否   | 数据。 |
48
49> **说明:**
50>
51> Uint8Array类型数据表示8位无符号整数的数组。
52
53## ParamsSpec
54
55加解密参数,在进行对称加解密时需要构造其子类对象,并将子类对象传入[init()](#init-1)方法。
56
57适用于需要iv等参数的对称加解密模式(对于无iv等参数的模式如ECB模式,无需构造,在[init()](#init-1)中传入null即可)。
58
59**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
60
61**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
62
63API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher64
65| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
66| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
67| algName | string | 否   | 否   | 指明对称加解密参数的算法模式。可选值如下:<br/> - "IvParamsSpec":适用于CBC\|CTR\|OFB\|CFB模式。<br/> - "GcmParamsSpec":适用于GCM模式。<br/> - "CcmParamsSpec":适用于CCM模式。 |
68
69> **说明:**
70>
71> 由于[init()](#init-1)的params参数是ParamsSpec类型(父类),而实际需要传入具体的子类对象(如IvParamsSpec),因此在构造子类对象时应设置其父类ParamsSpec的algName参数,使算法库在init()时知道传入的是哪种子类对象。
72
73## IvParamsSpec
74
75加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-1)方法的参数。
76
77适用于CBC、CTR、OFB、CFB这些需要iv作为参数的加解密模式。
78
79**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
80
81**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
82
83API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher84
85| 名称 | 类型                  | 只读 | 可选 | 说明                                                         |
86| ---- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
87| iv   | [DataBlob](#datablob) | 否   | 否  | 指明加解密参数iv。常见取值如下:<br/>- AES的CBC\|CTR\|OFB\|CFB模式:iv长度为16字节。<br/>- 3DES的CBC\|OFB\|CFB模式:iv长度为8字节。<br/>- SM4<sup>10+</sup>的CBC\|CTR\|OFB\|CFB模式:iv长度为16字节。 |
88
89> **说明:**
90>
91> 传入[init()](#init-1)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
92
93## GcmParamsSpec
94
95加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-1)方法的参数。
96
97适用于GCM模式。
98
99**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
100
101**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
102
103API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher104
105| 名称    | 类型                  | 只读 | 可选 | 说明                                                         |
106| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
107| iv      | [DataBlob](#datablob) | 否   | 否   | 指明加解密参数iv,长度为1~16字节,常用为12字节。                             |
108| aad     | [DataBlob](#datablob) | 否   | 否   | 指明加解密参数aad,长度为0~INT_MAX字节,常用为16字节。                             |
109| authTag | [DataBlob](#datablob) | 否   | 否   | 指明加解密参数authTag,长度为16字节。<br/>采用GCM模式加密时,需从[doFinal()](#dofinal)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob)中提取末尾16字节,作为[init()](#init-1)或[initSync()](#initsync12)方法中GcmParamsSpec的authTag。 |
110
111> **说明:**
112>
113> 1. 传入[init()](#init-1)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
114> 2. 对于1~16字节长度的iv,加解密算法库无额外限制,但结果取决于底层openssl的支持情况。
115> 3. 当aad参数不需要使用或aad长度为0时,可以将aad的data属性设置为一个空的Uint8Array,来构造GcmParamsSpec,写法为aad: { data: new Uint8Array() }。
116
117## CcmParamsSpec
118
119加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-1)方法的参数。
120
121适用于CCM模式。
122
123**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
124
125**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
126
127API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher128
129| 名称    | 类型                  | 只读 | 可选 | 说明                                                         |
130| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
131| iv      | [DataBlob](#datablob) | 否   | 否   | 指明加解密参数iv,长度为7字节。                              |
132| aad     | [DataBlob](#datablob) | 否   | 否   | 指明加解密参数aad,长度为8字节。                             |
133| authTag | [DataBlob](#datablob) | 否   | 否   | 指定加解密参数authTag,长度为12字节。<br/>在CCM模式加密时,需从[doFinal()](#dofinal)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob)末尾提取12字节,作为[init()](#init-1)或[initSync()](#initsync12)方法的参数[CcmParamsSpec](#ccmparamsspec)中的authTag。 |
134
135> **说明:**
136>
137> 传入[init()](#init-1)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
138
139## CryptoMode
140
141表示加解密操作的枚举。
142
143**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
144
145**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
146
147API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher148
149| 名称         | 值   | 说明               |
150| ------------ | ---- | ------------------ |
151| ENCRYPT_MODE | 0    | 表示进行加密操作。 |
152| DECRYPT_MODE | 1    | 表示进行解密操作。 |
153
154## AsyKeySpecItem<sup>10+</sup>
155
156表示密钥参数的枚举。
157
158**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
159
160**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
161
162API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey163
164| 名称         | 值   | 说明             |
165| ------------ | ---- | ---------------- |
166| DSA_P_BN | 101 | DSA算法的素模数p。 |
167| DSA_Q_BN | 102 | DSA算法中密钥参数q(p-1的素因子)。 |
168| DSA_G_BN | 103 | DSA算法的参数g。 |
169| DSA_SK_BN | 104 | DSA算法的私钥sk。 |
170| DSA_PK_BN | 105 | DSA算法的公钥pk。 |
171| ECC_FP_P_BN | 201 | ECC算法中表示椭圆曲线Fp域的素数p。 |
172| ECC_A_BN | 202 | ECC算法中椭圆曲线的第一个系数a。 |
173| ECC_B_BN | 203 | ECC算法中椭圆曲线的第二个系数b。 |
174| ECC_G_X_BN | 204 | ECC算法中基点g的x坐标。 |
175| ECC_G_Y_BN | 205 | ECC算法中基点g的y坐标。 |
176| ECC_N_BN | 206 | ECC算法中基点g的阶n。 |
177| ECC_H_NUM | 207 | ECC算法中的余因子h。 |
178| ECC_SK_BN | 208 | ECC算法中的私钥sk。 |
179| ECC_PK_X_BN | 209 | ECC算法中,公钥pk(椭圆曲线上的一个点)的x坐标。 |
180| ECC_PK_Y_BN | 210 | ECC算法中,公钥pk(椭圆曲线上的一个点)的y坐标。 |
181| ECC_FIELD_TYPE_STR | 211 | ECC算法中,椭圆曲线的域类型(当前只支持Fp域)。 |
182| ECC_FIELD_SIZE_NUM | 212 | ECC算法中域的大小,单位为bits(注:对于Fp域,域的大小为素数p的bits长度)。 |
183| ECC_CURVE_NAME_STR | 213 | ECC算法中的SECG(Standards for Efficient Cryptography Group)曲线名称。 |
184| RSA_N_BN | 301 | RSA算法中的模数n。 |
185| RSA_SK_BN | 302 | RSA算法中的私钥sk(即私钥指数d)。 |
186| RSA_PK_BN | 303 | RSA算法中的公钥pk(即公钥指数e)。 |
187| DH_P_BN<sup>11+</sup> | 401 | DH算法中的素数p。 |
188| DH_G_BN<sup>11+</sup> | 402 | DH算法中的参数g。 |
189| DH_L_NUM<sup>11+</sup> | 403 | DH算法中私钥长度,单位为bit。 |
190| DH_SK_BN<sup>11+</sup> | 404 | DH算法中的私钥sk。 |
191| DH_PK_BN<sup>11+</sup> | 405 | DH算法中的公钥pk。 |
192| ED25519_SK_BN<sup>11+</sup> | 501 | Ed25519算法中的私钥sk。 |
193| ED25519_PK_BN<sup>11+</sup> | 502 | Ed25519算法中的公钥pk。 |
194| X25519_SK_BN<sup>11+</sup> | 601 | X25519算法中的私钥sk。 |
195| X25519_PK_BN<sup>11+</sup> | 602 | X25519算法中的公钥pk。 |
196
197## AsyKeySpecType<sup>10+</sup>
198
199表示密钥参数类型的枚举。
200
201**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
202
203**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
204
205API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey206
207| 名称         | 值   | 说明             |
208| ------------ | ---- | ---------------- |
209| COMMON_PARAMS_SPEC | 0 | 表示公私钥中包含的公共参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair10)随机生成密钥对。 |
210| PRIVATE_KEY_SPEC | 1 | 表示私钥中包含的参数。使用此类型的参数可以调用[generatePriKey](#generateprikey10)生成指定的私钥。 |
211| PUBLIC_KEY_SPEC | 2 | 表示公钥中包含的参数。使用此类型的参数可以调用[generatePubKey](#generatepubkey10)生成指定的公钥。 |
212| KEY_PAIR_SPEC | 3 | 表示公私钥中包含的全量参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair10)生成指定的密钥对。 |
213
214## CipherSpecItem<sup>10+</sup>
215
216表示加解密参数的枚举。这些参数支持通过[setCipherSpec](#setcipherspec10)接口设置,通过[getCipherSpec](#getcipherspec10)接口获取。
217
218当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_MD_NAME_STR参数的支持,详细规格请参考[加解密规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md)。
219
220**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
221
222**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
223
224API version 10-11 系统能力为 SystemCapability.Security.CryptoFramework;从 API version 12 开始为SystemCapability.Security.CryptoFramework.Cipher
225
226| 名称         | 值   | 说明             |
227| ------------ | ---- | ---------------- |
228| OAEP_MD_NAME_STR | 100 | 表示RSA算法中,使用PKCS1_OAEP模式时,消息摘要功能的算法名。 |
229| OAEP_MGF_NAME_STR | 101 | 表示RSA算法中,使用PKCS1_OAEP模式时,掩码生成算法(目前仅支持MGF1)。 |
230| OAEP_MGF1_MD_STR | 102 | 表示RSA算法中,使用PKCS1_OAEP模式时,MGF1掩码生成功能的消息摘要算法。 |
231| OAEP_MGF1_PSRC_UINT8ARR | 103 | 表示RSA算法中,使用PKCS1_OAEP模式时,pSource的字节流。 |
232| SM2_MD_NAME_STR<sup>11+</sup> | 104 | 表示SM2算法中,使用的摘要算法名。 |
233
234## SignSpecItem<sup>10+</sup>
235
236表示签名验签参数的枚举。这些参数支持通过[setSignSpec](#setsignspec10)、[setVerifySpec](#setverifyspec10)接口设置,通过[getSignSpec](#getsignspec10)、[getVerifySpec](#getverifyspec10)接口获取。
237
238当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_USER_ID_UINT8ARR参数的支持,详细规格请参考[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。
239
240**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
241
242**系统能力:** SystemCapability.Security.CryptoFramework.Signature
243
244API version 10-11 系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为 SystemCapability.Security.CryptoFramework.Signature245
246| 名称         | 值   | 说明             |
247| ------------ | ---- | ---------------- |
248| PSS_MD_NAME_STR | 100 | 表示RSA算法中,使用PSS模式时,消息摘要功能的算法名。 |
249| PSS_MGF_NAME_STR | 101 | 表示RSA算法中,使用PSS模式时,掩码生成算法(目前仅支持MGF1)。 |
250| PSS_MGF1_MD_STR | 102 | 表示RSA算法中,使用PSS模式时,MGF1掩码生成功能的消息摘要参数。 |
251| PSS_SALT_LEN_NUM | 103 | 表示RSA算法中,使用PSS模式时,盐值的长度,长度以字节为单位。 |
252| PSS_TRAILER_FIELD_NUM | 104 | 表示RSA算法中,使用PSS模式时,用于编码操作的整数。 |
253| SM2_USER_ID_UINT8ARR<sup>11+</sup> | 105 | 表示SM2算法中,用户身份标识字段。 |
254
255## AsyKeySpec<sup>10+</sup>
256
257指定非对称密钥参数的基本接口,用于创建密钥生成器。在指定非对称密钥参数时需要构造其子类对象,并将子类对象传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。构造子类对象时,除了RSA密钥采用小端写法外,其他bigint类型的密钥参数均采用大端写法,并使用正数。
258
259**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
260
261**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
262
263API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey264
265| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
266| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
267| algName | string | 否   | 否   | 指定非对称密钥的算法名称,比如"RSA"、"DSA"、"ECC"、"SM2"、"Ed25519"、"X25519"、"DH"。 |
268| specType | [AsyKeySpecType](#asykeyspectype10) | 否   | 否 | 指定密钥参数类型,用于区分公/私钥参数。 |
269
270## DSACommonParamsSpec<sup>10+</sup>
271
272密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的公共参数,随机生成公/私钥。
273
274在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
275
276**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
277
278**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
279
280API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey281
282| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
283| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
284| p | bigint | 否   | 否   | 指定DSA算法的素模数p。 |
285| q | bigint | 否   | 否   | 指定DSA算法中密钥参数q(p-1的素因子)。 |
286| g | bigint | 否   | 否   | 指定DSA算法的参数g。 |
287
288## DSAPubKeySpec<sup>10+</sup>
289
290密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公钥包含的参数。
291
292在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
293
294**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
295
296**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
297
298API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey299
300| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
301| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
302| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 否   | 否   | 指定DSA算法中公私钥包含的公共参数。 |
303| pk | bigint | 否   | 否   | 指定DSA算法的公钥值。 |
304
305## DSAKeyPairSpec<sup>10+</sup>
306
307密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的全量参数。
308
309在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
310
311**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
312
313**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
314
315API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey316
317| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
318| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
319| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 否   | 否   | 指定DSA算法中公私钥都包含的公共参数。 |
320| sk | bigint | 否   | 否   | 指定DSA算法的私钥值sk。 |
321| pk | bigint | 否   | 否   | 指定DSA算法的公钥值pk。 |
322
323## ECField<sup>10+</sup>
324
325指定椭圆曲线的域类型。当前只支持Fp域。
326
327**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
328
329**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
330
331API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey332
333| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
334| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
335| fieldType | string | 否   | 否   | 指定椭圆曲线域的类型,当前只支持"Fp"。 |
336
337## ECFieldFp<sup>10+</sup>
338
339指定椭圆曲线的素数域。是[ECField](#ecfield10)的子类。
340
341**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
342
343**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
344
345API version 10-11系统能力为SystemCapability.Security.CryptoFramework。从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey346
347| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
348| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
349| p | bigint | 否   | 否   | 指定素数p的值。 |
350
351## Point<sup>10+</sup>
352
353指定椭圆曲线上的一个点。
354
355**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
356
357**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
358
359API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey360
361| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
362| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
363| x | bigint | 否   | 否   | 指定椭圆曲线上点的x坐标。 |
364| y | bigint | 否   | 否   | 指定椭圆曲线上点的y坐标。 |
365
366## ECCCommonParamsSpec<sup>10+</sup>
367
368密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的公共参数,随机生成公/私钥。
369
370在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
371
372**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
373
374**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
375
376API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey377
378| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
379| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
380| field | [ECField](#ecfield10) | 否   | 否   | 指定椭圆曲线的域(当前只支持Fp域)。 |
381| a | bigint | 否   | 否   | 指定椭圆曲线的第一个系数a。 |
382| b | bigint | 否   | 否   | 指定椭圆曲线的第二个系数b。 |
383| g | [Point](#point10) | 否   | 否   | 指定基点g。 |
384| n | bigint | 否   | 否   | 指定基点g的阶数n。 |
385| h | number | 否   | 否   | 指定余因子h。 |
386
387## ECCPriKeySpec<sup>10+</sup>
388
389密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中私钥包含的参数。
390
391在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
392
393**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
394
395**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
396
397API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey398
399| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
400| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
401| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 否   | 否   | 指定ECC算法中公私钥都包含的公共参数。 |
402| sk | bigint | 否   | 否   | 指定ECC算法的私钥sk。 |
403
404## ECCPubKeySpec<sup>10+</sup>
405
406密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公钥包含的参数。
407
408在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
409
410**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
411
412**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
413
414API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey415
416| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
417| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
418| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 否   | 否   | 指定ECC算法中公私钥都包含的公共参数。 |
419| pk | [Point](#point10) | 否   | 否   | 指定ECC算法的公钥pk。 |
420
421## ECCKeyPairSpec<sup>10+</sup>
422
423密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的全量参数。
424
425在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
426
427**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
428
429**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
430
431API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey432
433| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
434| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
435| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 否   | 否   | 指定ECC算法中公私钥都包含的公共参数。 |
436| sk | bigint | 否   | 否   | 指定ECC算法的私钥sk。 |
437| pk | [Point](#point10) | 否   | 否   | 指定ECC算法的公钥pk。 |
438
439## RSACommonParamsSpec<sup>10+</sup>
440
441密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的公共参数,随机生成公/私钥。
442
443在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
444
445**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
446
447**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
448
449API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey450
451| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
452| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
453| n | bigint | 否   | 否   | 指定模数n。 |
454
455## RSAPubKeySpec<sup>10+</sup>
456
457密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公钥包含的参数。
458
459在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
460
461**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
462
463**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
464
465API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey466
467| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
468| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
469| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 否   | 否   | 指定RSA算法中公私钥都包含的公共参数。 |
470| pk | bigint | 否   | 否   | 指定RSA算法的公钥pk。 |
471
472## RSAKeyPairSpec<sup>10+</sup>
473
474密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的全量参数。
475
476在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
477
478**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
479
480**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
481
482API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey483
484| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
485| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
486| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 否   | 否   | 指定RSA算法中公私钥都包含的公共参数。 |
487| sk | bigint | 否   | 否   | 指定RSA算法的私钥sk。 |
488| pk | bigint | 否   | 否   | 指定RSA算法的公钥pk。 |
489
490## ED25519PriKeySpec<sup>11+</sup>
491
492密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定Ed25519算法中私钥包含的参数。
493
494在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
495
496**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
497
498**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
499
500API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey501
502| 名称 | 类型   | 只读 | 可选 | 说明                      |
503| ---- | ------ | ---- | ---- | ------------------------- |
504| sk   | bigint | 否   | 否   | 指定Ed25519算法的私钥sk。 |
505
506## ED25519PubKeySpec<sup>11+</sup>
507
508密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定Ed25519算法中公钥包含的参数。
509
510在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
511
512**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
513
514**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
515
516API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey517
518| 名称 | 类型   | 只读 | 可选 | 说明                      |
519| ---- | ------ | ---- | ---- | ------------------------- |
520| pk   | bigint | 否   | 否   | 指定Ed25519算法的公钥pk。 |
521
522## ED25519KeyPairSpec<sup>11+</sup>
523
524密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定Ed25519算法中公私钥包含的全量参数。
525
526在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
527
528**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
529
530**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
531
532API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey533
534| 名称 | 类型   | 只读 | 可选 | 说明                      |
535| ---- | ------ | ---- | ---- | ------------------------- |
536| sk   | bigint | 否   | 否   | 指定Ed25519算法的私钥sk。 |
537| pk   | bigint | 否   | 否   | 指定Ed25519算法的公钥pk。 |
538
539## X25519PriKeySpec<sup>11+</sup>
540
541密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中私钥包含的参数。
542
543在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
544
545**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
546
547**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
548
549API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey550
551| 名称 | 类型   | 只读 | 可选 | 说明                     |
552| ---- | ------ | ---- | ---- | ------------------------ |
553| sk   | bigint | 否   | 否   | 指定X25519算法的私钥sk。 |
554
555## X25519PubKeySpec<sup>11+</sup>
556
557密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公钥包含的参数。
558
559在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
560
561**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
562
563**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
564
565API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey566
567| 名称 | 类型   | 只读 | 可选 | 说明                     |
568| ---- | ------ | ---- | ---- | ------------------------ |
569| pk   | bigint | 否   | 否   | 指定X25519算法的公钥pk。 |
570
571## X25519KeyPairSpec<sup>11+</sup>
572
573密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公私钥包含的全量参数。
574
575在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
576
577**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
578
579**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
580
581API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey582
583| 名称 | 类型   | 只读 | 可选 | 说明                     |
584| ---- | ------ | ---- | ---- | ------------------------ |
585| sk   | bigint | 否   | 否   | 指定X25519算法的私钥sk。 |
586| pk   | bigint | 否   | 否   | 指定X25519算法的公钥pk。 |
587
588## DHCommonParamsSpec<sup>11+</sup>
589
590密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的参数。
591
592在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
593
594**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
595
596**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
597
598API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey599
600| 名称 | 类型   | 只读 | 可选 | 说明                                |
601| ---- | ------ | ---- | ---- | ----------------------------------- |
602| p    | bigint | 否   | 否   | 指定DH算法中大素数p。               |
603| g    | bigint | 否   | 否   | 指定DH算法中参数g。                 |
604| l    | number | 否   | 否   | 指定DH算法中私钥的长度,单位为bit。 |
605
606## DHPriKeySpec<sup>11+</sup>
607
608密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中私钥包含的参数。
609
610在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
611
612**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
613
614**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
615
616API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey617
618| 名称   | 类型               | 只读 | 可选 | 说明                                 |
619| ------ | ------------------ | ---- | ---- | ------------------------------------ |
620| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 否   | 否   | 指定DH算法中公私钥都包含的公共参数。 |
621| sk     | bigint             | 否   | 否   | 指定DH算法的私钥sk。                 |
622
623## DHPubKeySpec<sup>11+</sup>
624
625密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公钥包含的参数。
626
627在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
628
629**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
630
631**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
632
633API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey634
635| 名称   | 类型               | 只读 | 可选 | 说明                                 |
636| ------ | ------------------ | ---- | ---- | ------------------------------------ |
637| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 否   | 否   | 指定DH算法中公私钥都包含的公共参数。 |
638| pk     | bigint             | 否   | 否   | 指定DH算法的公钥pk。                 |
639
640## DHKeyPairSpec<sup>11+</sup>
641
642密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的全量参数。
643
644在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
645
646**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
647
648**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
649
650API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey651
652| 名称   | 类型               | 只读 | 可选 | 说明                                 |
653| ------ | ------------------ | ---- | ---- | ------------------------------------ |
654| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 否   | 否   | 指定DH算法中公私钥都包含的公共参数。 |
655| sk     | bigint             | 否   | 否   | 指定DH算法的私钥sk。                 |
656| pk     | bigint             | 否   | 否   | 指定DH算法的公钥pk。                 |
657
658## KdfSpec<sup>11+</sup>
659
660密钥派生函数参数,使用密钥派生函数进行密钥派生时,需要构建其子类对象并作为输入。
661
662**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
663
664**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
665
666API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf667
668| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
669| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
670| algName | string | 否   | 否   | 指明密钥派生函数的算法名,如"PBKDF2"。 |
671
672## PBKDF2Spec<sup>11+</sup>
673
674密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为PBKDF2密钥派生函数进行密钥派生时的输入。
675
676**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
677
678**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
679
680API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf681
682| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
683| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
684| password | string \| Uint8Array | 否   | 否   | 用户输入的原始密码。|
685| salt | Uint8Array | 否   | 否   | 盐值。 |
686| iterations | number | 否   | 否   | 迭代次数,需要为正整数。 |
687| keySize | number | 否   | 否   | 派生得到的密钥字节长度。 |
688
689> **说明:**
690>
691>  password 是原始密码。如果使用 string 类型,需直接传入用于密钥派生的数据,而不是 HexString 或 base64 等字符串类型,并确保该字符串为 UTF-8 编码,否则派生结果会有差异。
692
693## HKDFSpec<sup>12+</sup>
694
695密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为HKDF密钥派生函数进行密钥派生时的输入。
696
697**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
698
699**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
700
701| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
702| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
703| key | string \| Uint8Array | 否   | 否   | 密钥材料。|
704| salt | Uint8Array | 否   | 否   | 盐值。 |
705| info | Uint8Array | 否   | 否   | 拓展信息。 |
706| keySize | number | 否   | 否   | 派生得到的密钥字节长度。 |
707
708> **说明:**
709>
710> key指的是用户输入的最初的密钥材料。info与salt是可选参数,根据模式的不同可以传空,但是不可不传。
711>
712> 例如:EXTRACT_AND_EXPAND模式需要输入全部的值,EXTRACT_ONLY模式info可以为空,在构建HKDFspec的时候,info传入null值。
713>
714> 默认的模式为EXTRACT_AND_EXPAND,"HKDF|SHA256|EXTRACT_AND_EXPAND"等价于"HKDF|SHA256"。
715
716## ScryptSpec<sup>18+</sup>
717
718密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为SCRYPT密钥派生函数进行密钥派生时的输入。
719
720**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
721
722**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
723
724| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
725| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
726| passphrase | string \| Uint8Array | 否   | 否   | 用户输入的原始密码。|
727| salt | Uint8Array | 否   | 否   | 盐值。 |
728| n | number | 否   | 否   | 迭代次数,需要为正整数。 |
729| p | number | 否   | 否   | 并行化参数,需要为正整数。 |
730| r | number | 否   | 否   | 块大小参数,需要为正整数。 |
731| maxMemory | number | 否   | 否   | 最大内存限制参数,需要为正整数。 |
732| keySize | number | 否   | 否   | 派生得到的密钥字节长度,需要为正整数。 |
733
734> **说明:**
735>
736> passphrase指的是原始密码,如果使用string类型,需要直接传入用于密钥派生的数据,而不是HexString、base64等字符串类型,同时需要确保该字符串为utf-8编码,否则派生结果会有差异。
737
738## SM2CipherTextSpec<sup>12+</sup>
739
740SM2密文参数,使用SM2密文格式转换函数进行格式转换时,需要用到此对象。可以通过指定此参数,生成符合国密标准的ASN.1格式的SM2密文,反之,也可以从ASN.1格式的SM2密文中获取具体参数。
741
742**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
743
744**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
745
746| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
747| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
748| xCoordinate | bigint | 否   | 否   | x分量。|
749| yCoordinate | bigint | 否   | 否   | y分量。 |
750| cipherTextData | Uint8Array | 否   | 否   | 密文。|
751| hashData | Uint8Array | 否   | 否   | 杂凑值。 |
752
753> **说明:**
754>
755> - hashData为使用SM3算法对明文数据运算得到的杂凑值,其长度固定为256位。
756>
757> - cipherTextData是与明文等长的密文。
758>
759> - 在拼接生成C1C3C2格式的密文时,如果x分量(C1_X)或y分量(C1_Y)的长度不足32字节,需要在高位补0,使得x分量和y分量的长度均为32字节。
760
761## KeyEncodingConfig<sup>18+</sup>
762RSA私钥编码参数,使用获取私钥字符串时,可以添加此参数,生成指定算法、密码的编码后的私钥字符串。
763
764**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
765
766**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
767
768| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
769| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
770| password | string | 否   | 否   | 密码。|
771| cipherName | string | 否   | 否   | 算法名。 |
772
773> **说明:**
774>
775> - password是必选参数,表示编码用到的密码。
776>
777> - cipherName是必选参数,可以指定编码用到的算法。当前仅支持AES-128-CBC、AES-192-CBC、AES-256-CBC、DES-EDE3-CBC。
778
779## MacSpec<sup>18+</sup>
780消息认证码参数,计算HMAC、CMAC消息认证码时,需要构建子类对象并作为输入参数。
781
782**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
783
784**系统能力:** SystemCapability.Security.CryptoFramework.Mac
785
786| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
787| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
788| algName | string | 否   | 否   | 消息验证码算法名。|
789
790> **说明:**
791>
792> algName是必选参数,表示消息验证码算法。
793
794## HmacSpec<sup>18+</sup>
795密钥派生函数参数[MacSpec](#macspec18)的子类,作为HMAC消息验证码计算的输入。
796
797**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
798
799**系统能力:** SystemCapability.Security.CryptoFramework.Mac
800
801| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
802| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
803| mdName | string | 否   | 否   | 摘要算法名。|
804
805> **说明:**
806>
807> mdName是必选参数,表示HMAC摘要算法。
808
809## CmacSpec<sup>18+</sup>
810密钥派生函数参数[MacSpec](#macspec18)的子类,作为CMAC消息验证码计算的输入。
811
812**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
813
814**系统能力:** SystemCapability.Security.CryptoFramework.Mac
815
816| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
817| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
818| cipherName | string | 否   | 否   | 对称加密算法名。 |
819
820> **说明:**
821>
822> cipherName是必选参数,表示CMAC对称加密算法。
823
824## EccSignatureSpec<sup>20+</sup>
825
826包含(r、s)的sm2签名数据的结构体。
827
828> **说明:**
829>
830> r和s的长度各为256位。
831
832**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
833
834**系统能力:** SystemCapability.Security.CryptoFramework.Signature
835
836| 名称    | 类型   | 只读 | 可选 | 说明                                                         |
837| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
838| r | bigint | 否   | 否   | r分量。|
839| s | bigint | 否   | 否   | s分量。 |
840
841## Key
842
843密钥(父类),在运行密码算法(如加解密)时需要提前生成其子类对象,并传入[Cipher](#cipher)实例的[init()](#init-1)方法。
844
845密钥可以通过密钥生成器来生成。
846
847### 属性
848
849**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
850
851**系统能力:** SystemCapability.Security.CryptoFramework.Key
852
853API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key854
855| 名称    | 类型   | 只读 | 可选 | 说明                         |
856| ------- | ------ | ---- | ---- | ---------------------------- |
857| format  | string | 是   | 否   | 密钥的格式。                 |
858| algName | string | 是   | 否   | 密钥对应的算法名(如果是对称密钥,则含密钥长度,否则不含密钥长度)。 |
859
860### getEncoded
861
862getEncoded(): DataBlob
863
864同步方法,获取密钥数据的字节流。密钥可以是对称密钥、公钥或私钥。公钥格式需符合ASN.1语法、X.509规范和DER编码;私钥格式需符合ASN.1语法、PKCS#8规范和DER编码。
865
866> **说明:**
867>
868> RSA算法使用密钥参数生成私钥时,私钥对象支持getEncoded。
869
870**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
871
872**系统能力:** SystemCapability.Security.CryptoFramework.Key
873
874API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key875
876**返回值:**
877
878| 类型                  | 说明                     |
879| --------------------- | ------------------------ |
880| [DataBlob](#datablob) | 用于查看密钥的具体内容。 |
881
882**错误码:**
883以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
884
885| 错误码ID | 错误信息               |
886| -------- | ---------------------- |
887| 801 | this operation is not supported. |
888| 17620001 | memory operation failed. |
889| 17630001 | crypto operation error. |
890
891**示例:**
892
893```ts
894import { cryptoFramework } from '@kit.CryptoArchitectureKit';
895
896async function testGenerateAesKey() {
897  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
898  let symKey = await symKeyGenerator.generateSymKey();
899  let encodedKey = symKey.getEncoded();
900  console.info('key hex:' + encodedKey.data);
901}
902```
903
904## SymKey
905
906对称密钥,是[Key](#key)的子类,在对称加解密时需要将其对象传入[Cipher](#cipher)实例的[init()](#init-1)方法使用。
907
908对称密钥可以通过对称密钥生成器[SymKeyGenerator](#symkeygenerator)来生成。
909
910### clearMem
911
912clearMem(): void
913
914同步方法,将系统底层内存中的密钥内容清零。建议在不再使用对称密钥实例时调用此函数,避免密钥数据在内存中存留过久。
915
916**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
917
918**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
919
920API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey921
922**示例:**
923
924```ts
925import { cryptoFramework } from '@kit.CryptoArchitectureKit';
926
927async function testGenerateAesKeyFun() {
928  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
929  let key = await symKeyGenerator.generateSymKey();
930  let encodedKey = key.getEncoded();
931  console.info('key blob: '+ encodedKey.data);    // Display key content.
932  key.clearMem();
933  encodedKey = key.getEncoded();
934  console.info('key blob:' + encodedKey.data);    // Display all 0s.
935}
936```
937
938## PubKey
939
940公钥,是[Key](#key)的子类,在非对称加解密、验签、密钥协商时需要将其对象作为输入使用。
941
942公钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
943
944### getAsyKeySpec<sup>10+</sup>
945
946getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number
947
948同步方法,获取密钥参数。
949
950**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
951
952**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
953
954API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey955
956**参数:**
957
958| 参数名 | 类型                  | 必填 | 说明                 |
959| ---- | --------------------- | ---- | -------------------- |
960| itemType  | [AsyKeySpecItem](#asykeyspecitem10) | 是   | 指定的密钥参数。 |
961
962**返回值:**
963
964| 类型                        | 说明                              |
965| --------------------------- | --------------------------------- |
966| bigint \| string \| number | 用于查看密钥参数的具体内容。 |
967
968**错误码:**
969以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
970
971| 错误码ID | 错误信息               |
972| -------- | ---------------------- |
973| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
974| 801 | this operation is not supported.          |
975| 17620001 | memory operation failed. |
976| 17630001 | crypto operation error. |
977
978**示例:**
979
980```ts
981import { cryptoFramework } from '@kit.CryptoArchitectureKit';
982
983// 根据关键规范构造EccCommonSpec结构体。EccCommonSpec结构体定义了ECC私钥和公钥的公共参数。
984function genEccCommonSpec(): cryptoFramework.ECCCommonParamsSpec {
985  let fieldFp: cryptoFramework.ECFieldFp = {
986    fieldType: 'Fp',
987    p: BigInt('0xffffffffffffffffffffffffffffffff000000000000000000000001')
988  }
989  let G: cryptoFramework.Point = {
990    x: BigInt('0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21'),
991    y: BigInt('0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34')
992  }
993  let eccCommonSpec: cryptoFramework.ECCCommonParamsSpec = {
994    algName: 'ECC',
995    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
996    field: fieldFp,
997    a: BigInt('0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffe'),
998    b: BigInt('0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4'),
999    g: G,
1000    n: BigInt('0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d'),
1001    h: 1
1002  }
1003  return eccCommonSpec;
1004}
1005
1006async function testgetAsyKeySpec() {
1007  let commKeySpec = genEccCommonSpec(); // 使用参数属性,构造ECC公私钥公共密钥参数对象。
1008  let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(commKeySpec); // 使用密钥参数对象创建生成器。
1009  let keyPair = await generatorBySpec.generateKeyPair(); // Generates an ECC key pair.
1010  let key = keyPair.pubKey;
1011  let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN);
1012  console.info('ecc item --- p: ' + p.toString(16));
1013}
1014```
1015
1016### getEncodedDer<sup>12+</sup>
1017
1018getEncodedDer(format: string): DataBlob
1019
1020支持根据指定的密钥格式(如规范、压缩状态等),获取符合ASN.1语法和DER编码的公钥数据。目前仅支持ECC压缩和非压缩格式的公钥数据。
1021
1022> **说明:**
1023>
1024> 本接口和[Key.getEncoded()](#getencoded)的区别是:
1025>
1026> 1. 本接口可根据入参决定数据的输出格式。
1027> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式,生成的数据格式与原始数据格式保持一致。(原始数据格式,指通过[convertKey](#convertkey-3)接口生成密钥对象时的数据格式)。
1028
1029**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1030
1031**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1032
1033**参数:**
1034
1035| 参数名 | 类型                  | 必填 | 说明                 |
1036| ---- | --------------------- | ---- | -------------------- |
1037| format  | string | 是   | 用于指定当前密钥格式,取值仅支持"X509\|COMPRESSED"和"X509\|UNCOMPRESSED"。 |
1038
1039**返回值:**
1040
1041| 类型                        | 说明                              |
1042| --------------------------- | --------------------------------- |
1043| [DataBlob](#datablob) | 返回满足ASN.1语法和DER编码的指定密钥格式的公钥数据。 |
1044
1045**错误码:**
1046以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
1047
1048| 错误码ID | 错误信息               |
1049| -------- | ---------------------- |
1050| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1051| 17620001 | memory operation failed. |
1052| 17630001 | crypto operation error. |
1053
1054**示例:**
1055
1056```ts
1057import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1058
1059async function testGetEncodedDer() {
1060  let pkData = new Uint8Array([48, 90, 48, 20, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 9, 43, 36, 3, 3, 2, 8, 1, 1, 7, 3, 66, 0, 4, 143, 39, 57, 249, 145, 50, 63, 222, 35, 70, 178, 121, 202, 154, 21, 146, 129, 75, 76, 63, 8, 195, 157, 111, 40, 217, 215, 148, 120, 224, 205, 82, 83, 92, 185, 21, 211, 184, 5, 19, 114, 33, 86, 85, 228, 123, 242, 206, 200, 98, 178, 184, 130, 35, 232, 45, 5, 202, 189, 11, 46, 163, 156, 152]);
1061  let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData };
1062  let generator = cryptoFramework.createAsyKeyGenerator('ECC_BrainPoolP256r1');
1063  let keyPair = await generator.convertKey(pubKeyBlob, null);
1064  let key = keyPair.pubKey;
1065  let returnBlob = key.getEncodedDer('X509|UNCOMPRESSED');
1066  console.info('returnBlob data:' + returnBlob.data);
1067}
1068```
1069
1070### getEncodedPem<sup>12+</sup>
1071
1072getEncodedPem(format: string): string
1073
1074同步方法,获取密钥数据的字符串。密钥可以是RSA公钥或私钥。公钥需符合X.509、PKCS#1规范,并采用PEM编码。
1075
1076**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1077
1078**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1079
1080**参数:**
1081
1082| 参数名 | 类型                  | 必填 | 说明                 |
1083| ---- | --------------------- | ---- | -------------------- |
1084| format  | string | 是   | 指定的获取密钥字符串的编码格式。其中,公钥可为'PKCS1' 或'X509'格式。|
1085
1086**返回值:**
1087
1088| 类型                        | 说明                              |
1089| --------------------------- | --------------------------------- |
1090| string | 用于获取指定密钥格式的具体内容。 |
1091
1092**错误码:**
1093以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
1094
1095| 错误码ID | 错误信息               |
1096| -------- | ---------------------- |
1097| 401 | invalid parameters.  Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1098| 17620001 | memory operation failed. |
1099| 17630001 | crypto operation error. |
1100
1101**示例:**
1102
1103```ts
1104import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1105
1106let publicPkcs1Str1024: string  =
1107  "-----BEGIN RSA PUBLIC KEY-----\n"
1108  + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n"
1109  + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n"
1110  + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n"
1111  + "-----END RSA PUBLIC KEY-----\n";
1112
1113function TestPubKeyPkcs1ToX509BySync1024() {
1114  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
1115  let keyPair = rsaGenerator.convertPemKeySync(publicPkcs1Str1024, null);
1116  let pubPemKey = keyPair.pubKey;
1117  let pubString = pubPemKey.getEncodedPem('X509');
1118  console.info("[sync]TestPubKeyPkcs1ToX509BySync1024 pubString output is " + pubString);
1119}
1120```
1121
1122## PriKey
1123
1124私钥,是[Key](#key)的子类,在非对称加解密、签名、密钥协商时需要将其作为输入使用。
1125
1126私钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
1127
1128### clearMem
1129
1130clearMem(): void
1131
1132同步方法,清零系统底层内存中的密钥内容。
1133
1134**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1135
1136**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1137
1138API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey1139
1140**示例:**
1141
1142```ts
1143import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1144
1145async function testClearMem() {
1146  let eccGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1147    // 使用密钥生成器随机生成非对称密钥对。
1148    let keyGenPromise = eccGenerator.generateKeyPair();
1149    keyGenPromise.then(keyPair => {
1150      let priKey = keyPair.priKey;
1151      let returnBlob = priKey.getEncodedDer('PKCS8');
1152      console.info('returnBlob data:' + returnBlob.data);
1153      priKey.clearMem(); // For the asymmetric private key, clearMem() releases the internal key struct. After clearMem is executed, getEncoded() is not supported.
1154    });
1155}
1156```
1157
1158### getAsyKeySpec<sup>10+</sup>
1159
1160getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number
1161
1162同步方法,获取密钥参数。
1163
1164**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1165
1166**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1167
1168API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey1169
1170**参数:**
1171
1172| 参数名 | 类型                  | 必填 | 说明                 |
1173| ---- | --------------------- | ---- | -------------------- |
1174| itemType  | [AsyKeySpecItem](#asykeyspecitem10) | 是   | 指定的密钥参数类型。 |
1175
1176**返回值:**
1177
1178| 类型                        | 说明                              |
1179| --------------------------- | --------------------------------- |
1180| bigint \| string \| number | 用于查看密钥参数的具体内容。 |
1181
1182**错误码:**
1183以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
1184
1185| 错误码ID | 错误信息               |
1186| -------- | ---------------------- |
1187| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1188| 801 | this operation is not supported.          |
1189| 17620001 | memory operation failed. |
1190| 17630001 | crypto operation error. |
1191
1192**示例:**
1193
1194```ts
1195// 根据关键规范构造EccCommonSpec结构体。EccCommonSpec结构体定义了ECC私钥和公钥的公共参数。
1196function genEccCommonSpec(): cryptoFramework.ECCCommonParamsSpec {
1197  let fieldFp: cryptoFramework.ECFieldFp = {
1198    fieldType: 'Fp',
1199    p: BigInt('0xffffffffffffffffffffffffffffffff000000000000000000000001')
1200  }
1201  let G: cryptoFramework.Point = {
1202    x: BigInt('0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21'),
1203    y: BigInt('0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34')
1204  }
1205  let eccCommonSpec: cryptoFramework.ECCCommonParamsSpec = {
1206    algName: 'ECC',
1207    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
1208    field: fieldFp,
1209    a: BigInt('0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffe'),
1210    b: BigInt('0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4'),
1211    g: G,
1212    n: BigInt('0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d'),
1213    h: 1
1214  }
1215  return eccCommonSpec;
1216}
1217
1218async function testgetAsyKeySpec() {
1219  let commKeySpec = genEccCommonSpec(); // 使用参数属性,构造ECC公私钥公共密钥参数对象。
1220  let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(commKeySpec); // 使用密钥参数对象创建生成器。
1221  let keyPair = await generatorBySpec.generateKeyPair(); // Generates an ECC key pair.
1222  let key = keyPair.priKey;
1223  let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN);
1224  console.info('ecc item --- p: ' + p.toString(16));
1225}
1226```
1227### getEncodedDer<sup>12+</sup>
1228
1229getEncodedDer(format: string): DataBlob
1230
1231支持根据指定的密钥格式(如采用哪个规范),获取满足ASN.1语法、DER编码的私钥数据。当前仅支持获取PKCS8格式的ecc私钥数据。
1232
1233> **说明:**
1234>
1235> 本接口和[Key.getEncoded()](#getencoded)的区别是:<br/>
1236> 1. 本接口可根据入参决定数据的输出格式,当前支持获取PKCS8格式的ecc私钥数据。
1237> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式。
1238
1239**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1240
1241**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1242
1243**参数:**
1244
1245| 参数名 | 类型                  | 必填 | 说明                 |
1246| ---- | --------------------- | ---- | -------------------- |
1247| format  | string | 是   | 用于指定当前密钥格式,取值当前仅支持"PKCS8"。 |
1248
1249**返回值:**
1250
1251| 类型                        | 说明                              |
1252| --------------------------- | --------------------------------- |
1253| [DataBlob](#datablob) | 返回满足ASN.1语法和DER编码的指定密钥格式的ECC私钥数据。 |
1254
1255**错误码:**
1256以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
1257
1258| 错误码ID | 错误信息               |
1259| -------- | ---------------------- |
1260| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1261| 17620001 | memory operation failed. |
1262| 17630001 | crypto operation error. |
1263
1264**示例:**
1265
1266```ts
1267import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1268
1269async function testGetEncodedDer() {
1270  let eccGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1271    // 使用密钥生成器随机生成非对称密钥对。
1272    let keyGenPromise = eccGenerator.generateKeyPair();
1273    keyGenPromise.then(keyPair => {
1274      let priKey = keyPair.priKey;
1275      let returnBlob = priKey.getEncodedDer('PKCS8');
1276      console.info('returnBlob data:' + returnBlob.data);
1277    });
1278}
1279```
1280
1281### getEncodedPem<sup>12+</sup>
1282
1283getEncodedPem(format: string): string
1284
1285同步方法,获取密钥数据的字符串。密钥可以是RSA公钥或私钥。私钥格式需符合PKCS#8、PKCS#1规范,并采用PEM编码。
1286
1287**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1288
1289**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1290
1291**参数:**
1292
1293| 参数名 | 类型                  | 必填 | 说明                 |
1294| ---- | --------------------- | ---- | -------------------- |
1295| format  | string | 是   | 指定的获取密钥字符串的编码格式。其中,私钥可为'PKCS1' 或'PKCS8'格式。|
1296
1297**返回值:**
1298
1299| 类型                        | 说明                              |
1300| --------------------------- | --------------------------------- |
1301| string | 用于获取指定密钥格式的具体内容。 |
1302
1303**错误码:**
1304以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。
1305
1306| 错误码ID | 错误信息               |
1307| -------- | ---------------------- |
1308| 401 | invalid parameters.  Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1309| 17620001 | memory operation failed. |
1310| 17630001 | crypto operation error. |
1311
1312**示例:**
1313
1314```ts
1315import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1316
1317let priKeyPkcs1Str1024: string  =
1318  "-----BEGIN RSA PRIVATE KEY-----\n"
1319  + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n"
1320  + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n"
1321  + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n"
1322  + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n"
1323  + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n"
1324  + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n"
1325  + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n"
1326  + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n"
1327  + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n"
1328  + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n"
1329  + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n"
1330  + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n"
1331  + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n"
1332  + "-----END RSA PRIVATE KEY-----\n";
1333
1334function TestPriKeyPkcs1ToPkcs8BySync1024() {
1335  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
1336  let keyPair = rsaGenerator.convertPemKeySync(null, priKeyPkcs1Str1024);
1337  let priPemKey = keyPair.priKey;
1338  let priString = priPemKey.getEncodedPem('PKCS8');
1339  console.info("[sync]TestPriKeyPkcs1ToPkcs8BySync1024 priString output is " + priString);
1340}
1341```
1342
1343### getEncodedPem<sup>18+</sup>
1344
1345getEncodedPem(format: string, config: KeyEncodingConfig): string
1346
1347同步方法,获取密钥数据的字符串。支持RSA公钥和私钥。私钥格式满足PKCS#8规范、PKCS#1规范和PEM编码方式。
1348
1349**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
1350
1351**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1352
1353**参数:**
1354
1355| 参数名 | 类型                  | 必填 | 说明                 |
1356| ---- | --------------------- | ---- | -------------------- |
1357| format  | string | 是   | 指定的获取密钥字符串的编码格式。其中,私钥可为'PKCS1' 或'PKCS8'格式。|
1358| config | [KeyEncodingConfig](#keyencodingconfig18) | 是 | 指定编码的算法跟口令,对私钥进行编码操作。 |
1359
1360**返回值:**
1361
1362| 类型                        | 说明                              |
1363| --------------------------- | --------------------------------- |
1364| string | 用于获取指定密钥格式的具体内容。如果填了config参数,则获取编码后的内容。 |
1365
1366**错误码:**
1367以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1368
1369| 错误码ID | 错误信息               |
1370| -------- | ---------------------- |
1371| 401 | invalid parameters.  Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1372| 801 | this operation is not supported.          |
1373| 17620001 | memory operation failed. |
1374| 17630001 | crypto operation error. |
1375
1376**示例:**
1377
1378```ts
1379import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1380
1381let priKeyPkcs1Str1024: string  =
1382  "-----BEGIN RSA PRIVATE KEY-----\n"
1383    + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n"
1384    + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n"
1385    + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n"
1386    + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n"
1387    + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n"
1388    + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n"
1389    + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n"
1390    + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n"
1391    + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n"
1392    + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n"
1393    + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n"
1394    + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n"
1395    + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n"
1396    + "-----END RSA PRIVATE KEY-----\n";
1397
1398function TestPriKeyPkcs1Encoded() {
1399  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
1400  let keyPair = rsaGenerator.convertPemKeySync(null, priKeyPkcs1Str1024);
1401  let options : cryptoFramework.KeyEncodingConfig = {
1402    password: "123456",
1403    cipherName: "AES-128-CBC"
1404  }
1405  let priPemKey = keyPair.priKey;
1406  let priString = priPemKey.getEncodedPem('PKCS1', options);
1407  console.info("[sync]TestPriKeyPkcs1Encoded priString output is " + priString);
1408}
1409```
1410
1411## KeyPair
1412
1413非对称密钥对包含公钥和私钥。
1414
1415可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
1416
1417> **说明:**
1418>
1419> KeyPair对象中的pubKey对象和priKey对象是KeyPair对象的成员。当KeyPair对象超出作用域时,其内部的pubKey对象和priKey对象将被析构。
1420>
1421> 业务方使用时应持有KeyPair对象的引用,而非内部pubKey或priKey对象的引用。
1422
1423### 属性
1424
1425**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1426
1427**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1428
1429API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey1430
1431| 名称    | 类型   | 只读 | 可选 | 说明           |
1432| ------- | ------ | ---- | ---- | ------------ |
1433| priKey  | [PriKey](#prikey) | 是   | 否   | 私钥。      |
1434| pubKey | [PubKey](#pubkey) | 是   | 否   | 公钥。       |
1435
1436## cryptoFramework.createSymKeyGenerator
1437
1438createSymKeyGenerator(algName: string): SymKeyGenerator
1439
1440通过指定算法名称获取相应的对称密钥生成器实例。
1441
1442支持的规格详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)。
1443
1444**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1445
1446**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1447
1448API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey1449
1450**参数:**
1451
1452| 参数名  | 类型   | 必填 | 说明                                                         |
1453| ------- | ------ | ---- | ------------------------------------------------------------ |
1454| algName | string | 是   | 待生成对称密钥生成器的算法名称。<br/>具体取值详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)一节中的“字符串参数”。 |
1455
1456**返回值:**
1457
1458| 类型                                | 说明                       |
1459| ----------------------------------- | -------------------------- |
1460| [SymKeyGenerator](#symkeygenerator) | 返回对称密钥生成器的对象。 |
1461
1462**错误码:**
1463以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1464
1465| 错误码ID | 错误信息               |
1466| -------- | ---------------------- |
1467| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1468| 801 | this operation is not supported. |
1469
1470**示例:**
1471
1472```ts
1473import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1474
1475let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1476```
1477
1478## SymKeyGenerator
1479
1480对称密钥生成器。
1481
1482在使用该类的方法前,先使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)构建SymKeyGenerator实例。
1483
1484### 属性
1485
1486**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1487
1488**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1489
1490API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey1491
1492| 名称    | 类型   | 只读 | 可选 | 说明                           |
1493| ------- | ------ | ---- | ---- | ------------------------------ |
1494| algName | string | 是   | 否   | 对称密钥生成器指定的算法名称。 |
1495
1496### generateSymKey
1497
1498generateSymKey(callback: AsyncCallback\<SymKey>): void
1499
1500异步获取对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。
1501
1502必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1503
1504目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
1505
1506> **说明:**
1507>
1508> 对于HMAC算法的对称密钥,如果在创建对称密钥生成器时指定了具体哈希算法(如“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如256位的密钥数据)。如果未指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKey](#convertkey)方式生成对称密钥数据。
1509
1510**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1511
1512**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1513
1514API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey1515
1516**参数:**
1517
1518| 参数名     | 类型                              | 必填 | 说明                                                         |
1519| -------- | --------------------------------- | ---- | ------------------------------------------------------------ |
1520| callback | AsyncCallback\<[SymKey](#symkey)> | 是   | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 |
1521
1522**错误码:**
1523以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
1524
1525| 错误码ID | 错误信息      |
1526| -------- | ------------- |
1527| 17620001 | memory operation failed. |
1528
1529**示例:**
1530
1531```ts
1532import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1533
1534let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1535  symKeyGenerator.generateSymKey((err, symKey) => {
1536    console.info('Generate symKey success, algName:' + symKey.algName);
1537  });
1538```
1539
1540### generateSymKey
1541
1542generateSymKey(): Promise\<SymKey>
1543
1544异步获取该对称密钥生成器随机生成的密钥,通过Promise获取结果。
1545
1546必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1547
1548目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
1549
1550**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1551
1552**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1553
1554API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey1555
1556**返回值:**
1557
1558| 类型                        | 说明                              |
1559| --------------------------- | --------------------------------- |
1560| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 |
1561
1562**错误码:**
1563以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1564
1565| 错误码ID | 错误信息      |
1566| -------- | ------------- |
1567| 17620001 | memory operation failed. |
1568
1569**示例:**
1570
1571```ts
1572import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1573import { BusinessError } from '@kit.BasicServicesKit';
1574
1575let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
1576  symKeyGenerator.generateSymKey()
1577    .then(symKey => {
1578      console.info('Generate symKey success, algName: ' + symKey.algName);
1579    }).catch((error: BusinessError) => {
1580      console.error(`Generate symKey failed, ${error.code}, ${error.message}`);
1581    });
1582```
1583
1584### generateSymKeySync<sup>12+</sup>
1585
1586generateSymKeySync(): SymKey
1587
1588同步获取对称密钥生成器随机生成的密钥。
1589
1590必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1591
1592目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
1593
1594> **说明:**
1595>
1596> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如指定“HMAC|SHA256”会随机生成256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKeySync](#convertkeysync12)方式生成对称密钥数据。
1597
1598**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1599
1600**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1601
1602**返回值:**
1603
1604| 类型                        | 说明                              |
1605| --------------------------- | --------------------------------- |
1606| [SymKey](#symkey) | 返回对称密钥SymKey。 |
1607
1608**错误码:**
1609以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1610
1611| 错误码ID | 错误信息      |
1612| -------- | ------------- |
1613| 17620001 | memory operation failed. |
1614
1615**示例:**
1616
1617```ts
1618import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1619
1620function testGenerateSymKeySync() {
1621  // 创建SymKeyGenerator实例。
1622  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
1623  // 使用密钥生成器随机生成对称密钥。
1624  let key = symKeyGenerator.generateSymKeySync();
1625  let encodedKey = key.getEncoded();
1626  console.info('key hex:' + encodedKey.data);
1627}
1628```
1629
1630### convertKey
1631
1632convertKey(key: DataBlob, callback: AsyncCallback\<SymKey>): void
1633
1634异步根据指定数据生成对称密钥,通过注册回调函数获取结果。
1635
1636必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1637
1638> **说明:**
1639>
1640> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如传入SHA256对应256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据。
1641
1642**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1643
1644**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1645
1646API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey1647
1648**参数:**
1649
1650| 参数名     | 类型          | 必填 | 说明                       |
1651| -------- | ------------------- | ---- | ---------------------|
1652| key      | [DataBlob](#datablob)             | 是   | 指定的对称密钥材料。                                         |
1653| callback | AsyncCallback\<[SymKey](#symkey)> | 是   | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 |
1654
1655**错误码:**
1656以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
1657
1658| 错误码ID | 错误信息                                               |
1659| -------- | --------------------------------------------------- |
1660| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1661| 17620001 | memory operation failed.                                       |
1662
1663**示例:**
1664
1665```ts
1666import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1667
1668function genKeyMaterialBlob(): cryptoFramework.DataBlob {
1669  let arr = [
1670    0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
1671    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
1672    0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes)
1673  let keyMaterial = new Uint8Array(arr);
1674  return { data: keyMaterial };
1675}
1676
1677function testConvertKey() {
1678  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1679  let keyMaterialBlob = genKeyMaterialBlob();
1680  symKeyGenerator.convertKey(keyMaterialBlob, (err, symKey) => {
1681    console.info('Convert symKey success, algName: ' + symKey.algName);
1682  });
1683}
1684```
1685
1686### convertKey
1687
1688convertKey(key: DataBlob): Promise\<SymKey>
1689
1690异步根据指定数据生成对称密钥,通过Promise获取结果。
1691
1692在使用本函数前,需先通过[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器。
1693
1694**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1695
1696**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1697
1698API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey1699
1700**参数:**
1701
1702| 参数名 | 类型                  | 必填 | 说明                 |
1703| ---- | --------------------- | ---- | -------------------- |
1704| key  | [DataBlob](#datablob) | 是   | 指定的密钥材料数据。 |
1705
1706**返回值:**
1707
1708| 类型                        | 说明                              |
1709| --------------------------- | --------------------------------- |
1710| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 |
1711
1712**错误码:**
1713以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
1714
1715| 错误码ID | 错误信息                                          |
1716| -------- | --------------------------------------------- |
1717| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1718| 17620001 | memory operation failed.                                |
1719
1720**示例:**
1721
1722```ts
1723import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1724import { BusinessError } from '@kit.BasicServicesKit';
1725
1726function genKeyMaterialBlob(): cryptoFramework.DataBlob {
1727  let arr = [
1728    0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
1729    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
1730    0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes)
1731  let keyMaterial = new Uint8Array(arr);
1732  return { data: keyMaterial };
1733}
1734
1735function testConvertKey() {
1736  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1737  let keyMaterialBlob = genKeyMaterialBlob();
1738  symKeyGenerator.convertKey(keyMaterialBlob)
1739    .then(symKey => {
1740      console.info('Convert symKey success, algName:' + symKey.algName);
1741    }).catch((error: BusinessError) => {
1742      console.error(`Convert symKey failed, ${error.code}, ${error.message}`);
1743    });
1744}
1745```
1746
1747### convertKeySync<sup>12+</sup>
1748
1749convertKeySync(key: DataBlob): SymKey
1750
1751同步根据指定数据生成对称密钥。
1752
1753必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1754
1755> **说明:**
1756>
1757> 对于HMAC算法的对称密钥,如果在创建对称密钥生成器时指定了具体哈希算法(如“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如SHA256对应的256位密钥数据)。如果在创建对称密钥生成器时未指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在1到4096字节范围内的任意二进制密钥数据。
1758
1759**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1760
1761**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1762
1763**参数:**
1764
1765| 参数名     | 类型          | 必填 | 说明                       |
1766| -------- | ------------------- | ---- | ---------------------|
1767| key      | [DataBlob](#datablob)             | 是   | 指定的对称密钥材料。                                         |
1768
1769**返回值:**
1770
1771| 类型                        | 说明                              |
1772| --------------------------- | --------------------------------- |
1773| [SymKey](#symkey) | 对称密钥。 |
1774
1775**错误码:**
1776以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1777
1778| 错误码ID | 错误信息                                               |
1779| -------- | --------------------------------------------------- |
1780| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1781| 17620001 | memory operation failed.                                       |
1782
1783**示例:**
1784
1785```ts
1786import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1787import { buffer } from '@kit.ArkTS';
1788
1789function testConvertKeySync() {
1790  // 对称密钥长度为64字节,512比特。
1791  let keyMessage = '87654321abcdefgh87654321abcdefgh87654321abcdefgh87654321abcdefgh';
1792  let keyBlob: cryptoFramework.DataBlob = {
1793    data : new Uint8Array(buffer.from(keyMessage, 'utf-8').buffer)
1794  }
1795  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC');
1796  let key = symKeyGenerator.convertKeySync(keyBlob);
1797  let encodedKey = key.getEncoded();
1798  console.info('key encoded data:' + encodedKey.data);
1799}
1800```
1801
1802## cryptoFramework.createAsyKeyGenerator
1803
1804createAsyKeyGenerator(algName: string): AsyKeyGenerator
1805
1806通过指定算法名称的字符串,获取相应的非对称密钥生成器实例。
1807
1808支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。
1809
1810**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1811
1812**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1813
1814API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey1815
1816**参数:**
1817
1818| 参数名  | 类型   | 必填 | 说明                             |
1819| ------- | ------ | ---- | -------------------------------- |
1820| algName | string | 是   | 非对称密钥生成支持的算法名。详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)中的字符串参数。 |
1821
1822**返回值:**
1823
1824| 类型            | 说明                         |
1825| --------------- | ---------------------------- |
1826| [AsyKeyGenerator](#asykeygenerator) | 返回非对称密钥生成器。 |
1827
1828**错误码:**
1829以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1830
1831| 错误码ID | 错误信息               |
1832| -------- | ---------------------- |
1833| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1834| 801 | this operation is not supported. |
1835| 17620001 | memory operation failed. |
1836
1837**示例:**
1838
1839```ts
1840import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1841
1842let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1843```
1844
1845## AsyKeyGenerator
1846
1847非对称密钥生成器。在使用该类的方法前,需要先使用createAsyKeyGenerator()方法构建一个AsyKeyGenerator实例。
1848
1849### 属性
1850
1851**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1852
1853**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1854
1855API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey1856
1857| 名称    | 类型   | 只读 | 可选 | 说明                             |
1858| ------- | ------ | ---- | ---- | -------------------------------- |
1859| algName | string | 是   | 否   | 非对称密钥生成器指定的算法名称。 |
1860
1861### generateKeyPair
1862
1863generateKeyPair(callback: AsyncCallback\<KeyPair>): void
1864
1865异步获取非对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。
1866
1867**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1868
1869**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1870
1871API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey1872
1873**参数:**
1874
1875| 参数名     | 类型                    | 必填 | 说明                           |
1876| -------- | ----------------------- | ---- | ------------------------------ |
1877| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
1878
1879**错误码:**
1880以下错误码的详细介绍请参见 [crypto framework错误码](errorcode-crypto-framework.md)。
1881
1882| 错误码ID | 错误信息               |
1883| -------- | ---------------------- |
1884| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types;|
1885| 17620001 | memory operation failed.          |
1886| 17630001 | crypto operation error.          |
1887
1888**示例:**
1889
1890```ts
1891import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1892
1893let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1894asyKeyGenerator.generateKeyPair((err, keyPair) => {
1895  if (err) {
1896    console.error("generateKeyPair: error.");
1897    return;
1898  }
1899  console.info('generateKeyPair: success.');
1900})
1901```
1902
1903### generateKeyPair
1904
1905generateKeyPair(): Promise\<KeyPair>
1906
1907异步获取非对称密钥生成器随机生成的密钥,通过Promise获取结果。
1908
1909**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1910
1911**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1912
1913API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey1914
1915**返回值:**
1916
1917| 类型              | 说明                              |
1918| ----------------- | --------------------------------- |
1919| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
1920
1921**错误码:**
1922以下错误码的详细介绍请参见[crypto framework 错误码](errorcode-crypto-framework.md)。
1923
1924| 错误码ID | 错误信息               |
1925| -------- | ---------------------- |
1926| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
1927| 17620001 | memory operation failed.          |
1928| 17630001 | crypto operation error.          |
1929
1930**示例:**
1931
1932```ts
1933import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1934import { BusinessError } from '@kit.BasicServicesKit';
1935
1936let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1937let keyGenPromise = asyKeyGenerator.generateKeyPair();
1938keyGenPromise.then(keyPair => {
1939  console.info('generateKeyPair success.');
1940}).catch((error: BusinessError) => {
1941  console.error("generateKeyPair error.");
1942});
1943```
1944
1945### generateKeyPairSync<sup>12+</sup>
1946
1947generateKeyPairSync(): KeyPair
1948
1949同步获取非对称密钥生成器随机生成的密钥。
1950
1951**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1952
1953**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1954
1955**返回值:**
1956
1957| 类型              | 说明                              |
1958| ----------------- | --------------------------------- |
1959| [KeyPair](#keypair) | 非对称密钥。 |
1960
1961**错误码:**
1962以下错误码的详细介绍请参见[crypto framework 错误码](errorcode-crypto-framework.md)。
1963
1964| 错误码ID | 错误信息               |
1965| -------- | ---------------------- |
1966| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.          |
1967| 17620001 | memory operation failed.          |
1968| 17630001 | crypto operation error.          |
1969
1970**示例:**
1971
1972```ts
1973import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1974
1975let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1976try {
1977  let keyPairData = asyKeyGenerator.generateKeyPairSync();
1978  if (keyPairData != null) {
1979    console.info('[Sync]: key pair success');
1980  } else {
1981    console.error("[Sync]: get key pair result fail!");
1982  }
1983} catch (e) {
1984  console.error(`sync error, ${e.code}, ${e.message}`);
1985}
1986```
1987
1988### convertKey
1989
1990convertKey(pubKey: DataBlob | null, priKey: DataBlob | null, callback: AsyncCallback\<KeyPair\>): void
1991
1992异步获取指定数据生成非对称密钥,通过注册回调函数获取结果。详情请看下方**密钥转换说明**。
1993
1994**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1995
1996**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1997
1998API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey1999
2000**参数:**
2001
2002| 参数名     | 类型       | 必填 | 说明                           |
2003| -------- | ----------- | ---- | ------------------------------ |
2004| pubKey   | [DataBlob](#datablob) \| null<sup>10+</sup>    | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。        |
2005| priKey   | [DataBlob](#datablob) \| null<sup>10+</sup>   | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。        |
2006| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
2007
2008**错误码:**
2009以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2010
2011| 错误码ID | 错误信息               |
2012| -------- | ---------------------- |
2013| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2014| 17620001 | memory operation failed.          |
2015| 17630001 | crypto operation error.          |
2016
2017**示例:**
2018
2019```ts
2020import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2021
2022let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]);
2023let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]);
2024let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据。
2025let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据。
2026let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
2027asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => {
2028  if (err) {
2029    console.error("convertKey: error.");
2030    return;
2031  }
2032  console.info('convertKey: success.');
2033});
2034```
2035
2036### convertKey
2037
2038convertKey(pubKey: DataBlob | null, priKey: DataBlob | null): Promise\<KeyPair>
2039
2040异步获取指定数据生成非对称密钥,通过Promise获取结果。详情请看下方**密钥转换说明**。
2041
2042**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2043
2044**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2045
2046API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey2047
2048**参数:**
2049
2050| 参数名   | 类型    | 必填 | 说明             |
2051| ------ | -------- | ---- | ---------------- |
2052| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 |
2053| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 |
2054
2055**返回值:**
2056
2057| 类型              | 说明                              |
2058| ----------------- | --------------------------------- |
2059| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
2060
2061**错误码:**
2062以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2063
2064| 错误码ID | 错误信息               |
2065| -------- | ---------------------- |
2066| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2067| 17620001 | memory operation failed.          |
2068| 17630001 | crypto operation error.          |
2069
2070**示例:**
2071
2072```ts
2073import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2074import { BusinessError } from '@kit.BasicServicesKit';
2075
2076let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]);
2077let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]);
2078let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据。
2079let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据。
2080let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
2081let keyGenPromise = asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob);
2082keyGenPromise.then(keyPair => {
2083  console.info('convertKey success.');
2084}).catch((error: BusinessError) => {
2085  console.error("convertKey error.");
2086});
2087```
2088
2089### convertKeySync<sup>12+</sup>
2090
2091convertKeySync(pubKey: DataBlob | null, priKey: DataBlob | null): KeyPair
2092
2093同步获取指定数据生成非对称密钥。详情请看下方**密钥转换说明**。
2094
2095**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2096
2097**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2098
2099**参数:**
2100
2101| 参数名   | 类型    | 必填 | 说明             |
2102| ------ | -------- | ---- | ---------------- |
2103| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 指定公钥材料。如果公钥无需转换,传入null。API 10前仅支持DataBlob,API 10起支持传入null。 |
2104| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 指定私钥材料。API 10前仅支持DataBlob,API 10起支持传入null。 |
2105
2106**返回值:**
2107
2108| 类型              | 说明                              |
2109| ----------------- | --------------------------------- |
2110| [KeyPair](#keypair) | 非对称密钥。 |
2111
2112**错误码:**
2113以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2114
2115| 错误码ID | 错误信息               |
2116| -------- | ---------------------- |
2117| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2118| 17620001 | memory operation failed.          |
2119| 17630001 | crypto operation error.          |
2120
2121**示例:**
2122
2123```ts
2124import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2125
2126let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]);
2127let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]);
2128let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据。
2129let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据。
2130let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
2131try {
2132  let keyPairData = asyKeyGenerator.convertKeySync(pubKeyBlob, priKeyBlob);
2133  if (keyPairData != null) {
2134    console.info('[Sync]: key pair success');
2135  } else {
2136    console.error("[Sync]: convert key pair result fail!");
2137  }
2138} catch (e) {
2139  console.error(`sync error, ${e.code}, ${e.message}`);
2140}
2141```
2142
2143**密钥转换说明**
2144
21451. 非对称密钥(RSA、ECC、DSA)的公钥和私钥调用 getEncoded() 方法后,分别返回 X.509 格式的二进制数据和 PKCS#8 格式的二进制数据。对于 ECC 私钥,返回的是 RFC5915 定义的格式。这些数据可用于跨应用传输或持久化存储。
21462. 当调用convertKey方法将外来二进制数据转换为算法库非对称密钥对象时,公钥应符合ASN.1语法、X.509规范和DER编码格式;私钥应符合ASN.1语法、PKCS#8规范和DER编码格式。
21473. convertKey方法中,公钥和私钥二进制数据非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。
21484. convertKey或convertKeySync方法将外来二进制数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。
2149
2150### convertPemKey<sup>12+</sup>
2151
2152convertPemKey(pubKey: string | null, priKey: string | null): Promise\<KeyPair>
2153
2154异步获取指定数据生成非对称密钥,通过Promise获取结果。
2155
2156> **说明:**
2157> 1. 当调用convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、PEM编码格式,私钥应满足ASN.1语法、PKCS#8规范、PEM编码格式。
2158> 2. convertPemKey方法中,公钥和私钥字符串数据为非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。
2159> 3. convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。
2160
2161**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2162
2163**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2164
2165**参数:**
2166
2167| 参数名   | 类型    | 必填 | 说明             |
2168| ------ | -------- | ---- | ---------------- |
2169| pubKey | string \| null | 是  | 指定的公钥材料。如果公钥不需要转换,可直接传入null。|
2170| priKey | string \| null | 是  | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。|
2171
2172**返回值:**
2173
2174| 类型              | 说明                              |
2175| ----------------- | --------------------------------- |
2176| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
2177
2178**错误码:**
2179以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2180
2181| 错误码ID | 错误信息               |
2182| -------- | ---------------------- |
2183| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2184| 17620001 | memory operation failed.          |
2185| 17630001 | crypto operation error.          |
2186
2187**示例:**
2188
2189```ts
2190import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2191import { BusinessError } from '@kit.BasicServicesKit';
2192
2193let priKeyPkcs1Str1024: string  =
2194  "-----BEGIN RSA PRIVATE KEY-----\n"
2195    + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n"
2196    + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n"
2197    + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n"
2198    + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n"
2199    + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n"
2200    + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n"
2201    + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n"
2202    + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n"
2203    + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n"
2204    + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n"
2205    + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n"
2206    + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n"
2207    + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n"
2208    + "-----END RSA PRIVATE KEY-----\n";
2209let publicPkcs1Str1024: string  =
2210  "-----BEGIN RSA PUBLIC KEY-----\n"
2211    + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n"
2212    + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n"
2213    + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n"
2214    + "-----END RSA PUBLIC KEY-----\n";
2215async function TestConvertPemKeyByPromise() {
2216  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
2217  asyKeyGenerator.convertPemKey(publicPkcs1Str1024, priKeyPkcs1Str1024)
2218    .then(keyPair => {
2219    console.info('convertPemKey success.');
2220  }).catch((error: BusinessError) => {
2221    console.error("convertPemKey error.");
2222  });
2223}
2224```
2225
2226### convertPemKey<sup>18+</sup>
2227
2228convertPemKey(pubKey: string | null, priKey: string | null, password: string): Promise\<KeyPair>
2229
2230异步获取指定数据生成非对称密钥,通过Promise获取结果。
2231
2232> **说明:**
2233> 1. 当调用convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、PEM编码格式,私钥应满足ASN.1语法、PKCS#8规范、PEM编码格式。
2234> 2. convertPemKey方法中,公钥和私钥字符串数据为非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。
2235> 3. convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。
2236> 4. password为口令,传入后可以解密加密后的私钥。
2237
2238**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
2239
2240**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2241
2242**参数:**
2243
2244| 参数名   | 类型    | 必填 | 说明             |
2245| ------ | -------- | ---- | ---------------- |
2246| pubKey | string \| null | 是  | 指定的公钥材料。如果公钥不需要转换,可直接传入null。|
2247| priKey | string \| null | 是  | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。|
2248| password | string | 是 | 指定口令,用于解密私钥。|
2249
2250**返回值:**
2251
2252| 类型              | 说明                              |
2253| ----------------- | --------------------------------- |
2254| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
2255
2256**错误码:**
2257以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2258
2259| 错误码ID | 错误信息               |
2260| -------- | ---------------------- |
2261| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2262| 17620001 | memory operation failed.          |
2263| 17630001 | crypto operation error.          |
2264
2265**示例:**
2266
2267```ts
2268import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2269import { BusinessError } from '@kit.BasicServicesKit';
2270
2271let priKeyPkcs1EncodingStr : string =
2272  "-----BEGIN RSA PRIVATE KEY-----\n"
2273    +"Proc-Type: 4,ENCRYPTED\n"
2274    +"DEK-Info: AES-128-CBC,815A066131BF05CF87CE610A59CC69AE\n\n"
2275    +"7Jd0vmOmYGFZ2yRY8fqRl3+6rQlFtNcMILvcb5KWHDSrxA0ULmJE7CW0DSRikHoA\n"
2276    +"t0KgafhYXeQXh0dRy9lvVRAFSLHCLJVjchx90V7ZSivBFEq7+iTozVp4AlbgYsJP\n"
2277    +"vx/1sfZD2WAcyMJ7IDmJyft7xnpVSXsyWGTT4f3eaHJIh1dqjwrso7ucAW0FK6rp\n"
2278    +"/TONyOoXNfXtRbVtxNyCWBxt4HCSclDZFvS9y8fz9ZwmCUV7jei/YdzyQI2wnE13\n"
2279    +"W8cKlpzRFL6BWi8XPrUtAw5MWeHBAPUgPWMfcmiaeyi5BJFhQCrHLi+Gj4EEJvp7\n"
2280    +"mP5cbnQAx6+paV5z9m71SKrI/WSc4ixsYYdVmlL/qwAK9YliFfoPl030YJWW6rFf\n"
2281    +"T7J9BUlHGUJ0RB2lURNNLakM+UZRkeE9TByzCzgTxuQtyv5Lwsh2mAk3ia5x0kUO\n"
2282    +"LHg3Eoabhdh+YZA5hHaxnpF7VjspB78E0F9Btq+A41rSJ6zDOdToHey4MJ2nxdey\n"
2283    +"Z3bi81TZ6Fp4IuROrvZ2B/Xl3uNKR7n+AHRKnaAO87ywzyltvjwSh2y3xhJueiRs\n"
2284    +"BiYkyL3/fnocD3pexTdN6h3JgQGgO5GV8zw/NrxA85mw8o9im0HreuFObmNj36T9\n"
2285    +"k5N+R/QIXW83cIQOLaWK1ThYcluytf0tDRiMoKqULiaA6HvDMigExLxuhCtnoF8I\n"
2286    +"iOLN1cPdEVQjzwDHLqXP2DbWW1z9iRepLZlEm1hLRLEmOrTGKezYupVv306SSa6J\n"
2287    +"OA55lAeXMbyjFaYCr54HWrpt4NwNBX1efMUURc+1LcHpzFrBTTLbfjIyq6as49pH\n"
2288    +"-----END RSA PRIVATE KEY-----\n"
2289
2290async function TestConvertPemKeyByPromise() {
2291  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
2292  asyKeyGenerator.convertPemKey(null, priKeyPkcs1EncodingStr, "123456")
2293    .then(keyPair => {
2294    console.info('convertPemKey success.');
2295  }).catch((error: BusinessError) => {
2296    console.error("convertPemKey error.");
2297  });
2298}
2299```
2300
2301### convertPemKeySync<sup>12+</sup>
2302
2303convertPemKeySync(pubKey: string | null, priKey: string | null): KeyPair
2304
2305同步获取指定数据,生成非对称密钥。
2306
2307> **说明:**
2308> convertPemKeySync接口与convertPemKey接口注意事项相同,见[convertPemKey](#convertpemkey12)接口说明。
2309
2310**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2311
2312**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2313
2314**参数:**
2315
2316| 参数名   | 类型    | 必填 | 说明             |
2317| ------ | -------- | ---- | ---------------- |
2318| pubKey | string \| null| 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。|
2319| priKey | string \| null| 是   | 指定私钥材料。私钥无需转换时,可传入null。注意:公钥和私钥材料不能同时为null。|
2320
2321**返回值:**
2322
2323| 类型              | 说明                              |
2324| ----------------- | --------------------------------- |
2325| [KeyPair](#keypair) | 非对称密钥。 |
2326
2327**错误码:**
2328以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
2329
2330| 错误码ID | 错误信息               |
2331| -------- | ---------------------- |
2332| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2333| 17620001 | memory operation failed.          |
2334| 17630001 | crypto operation error.          |
2335
2336**示例:**
2337
2338```ts
2339import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2340import { BusinessError } from '@kit.BasicServicesKit';
2341
2342let priKeyPkcs1Str1024: string  =
2343  "-----BEGIN RSA PRIVATE KEY-----\n"
2344  + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n"
2345  + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n"
2346  + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n"
2347  + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n"
2348  + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n"
2349  + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n"
2350  + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n"
2351  + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n"
2352  + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n"
2353  + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n"
2354  + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n"
2355  + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n"
2356  + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n"
2357  + "-----END RSA PRIVATE KEY-----\n";
2358  let publicPkcs1Str1024: string  =
2359  "-----BEGIN RSA PUBLIC KEY-----\n"
2360  + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n"
2361  + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n"
2362  + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n"
2363  + "-----END RSA PUBLIC KEY-----\n";
2364function TestConvertPemKeyBySync() {
2365  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
2366  try {
2367    let keyPairData = asyKeyGenerator.convertPemKeySync(publicPkcs1Str1024, priKeyPkcs1Str1024);
2368    if (keyPairData != null) {
2369      console.info('[Sync]: convert pem key pair success');
2370    } else {
2371      console.error("[Sync]: convert pem key pair result fail!");
2372    }
2373  } catch (e) {
2374    console.error(`Sync error, ${e.code}, ${e.message}`);
2375  }
2376}
2377```
2378
2379### convertPemKeySync<sup>18+</sup>
2380
2381convertPemKeySync(pubKey: string | null, priKey: string | null, password: string): KeyPair
2382
2383同步获取指定数据,生成非对称密钥。
2384
2385> **说明:**
2386> convertPemKeySync接口与convertPemKey接口注意事项相同,见[convertPemKey](#convertpemkey18)接口说明。
2387
2388**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
2389
2390**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2391
2392**参数:**
2393
2394| 参数名   | 类型    | 必填 | 说明             |
2395| ------ | -------- | ---- | ---------------- |
2396| pubKey | string \| null| 是   | 指定的公钥材料。如果公钥不需要转换,可传入null。|
2397| priKey | string \| null| 是   | 指定私钥材料。若无需转换,传入 null。注意:公钥与私钥材料不可同时为 null。|
2398| password | string | 是 | 指定口令,用于解密私钥。|
2399
2400**返回值:**
2401
2402| 类型              | 说明                              |
2403| ----------------- | --------------------------------- |
2404| [KeyPair](#keypair) | 非对称密钥。 |
2405
2406**错误码:**
2407以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
2408
2409| 错误码ID | 错误信息               |
2410| -------- | ---------------------- |
2411| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2412| 17620001 | memory operation failed.          |
2413| 17630001 | crypto operation error.          |
2414
2415**示例:**
2416
2417```ts
2418import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2419import { BusinessError } from '@kit.BasicServicesKit';
2420
2421let priKeyPkcs1EncodingStr : string =
2422  "-----BEGIN RSA PRIVATE KEY-----\n"
2423    +"Proc-Type: 4,ENCRYPTED\n"
2424    +"DEK-Info: AES-128-CBC,815A066131BF05CF87CE610A59CC69AE\n\n"
2425    +"7Jd0vmOmYGFZ2yRY8fqRl3+6rQlFtNcMILvcb5KWHDSrxA0ULmJE7CW0DSRikHoA\n"
2426    +"t0KgafhYXeQXh0dRy9lvVRAFSLHCLJVjchx90V7ZSivBFEq7+iTozVp4AlbgYsJP\n"
2427    +"vx/1sfZD2WAcyMJ7IDmJyft7xnpVSXsyWGTT4f3eaHJIh1dqjwrso7ucAW0FK6rp\n"
2428    +"/TONyOoXNfXtRbVtxNyCWBxt4HCSclDZFvS9y8fz9ZwmCUV7jei/YdzyQI2wnE13\n"
2429    +"W8cKlpzRFL6BWi8XPrUtAw5MWeHBAPUgPWMfcmiaeyi5BJFhQCrHLi+Gj4EEJvp7\n"
2430    +"mP5cbnQAx6+paV5z9m71SKrI/WSc4ixsYYdVmlL/qwAK9YliFfoPl030YJWW6rFf\n"
2431    +"T7J9BUlHGUJ0RB2lURNNLakM+UZRkeE9TByzCzgTxuQtyv5Lwsh2mAk3ia5x0kUO\n"
2432    +"LHg3Eoabhdh+YZA5hHaxnpF7VjspB78E0F9Btq+A41rSJ6zDOdToHey4MJ2nxdey\n"
2433    +"Z3bi81TZ6Fp4IuROrvZ2B/Xl3uNKR7n+AHRKnaAO87ywzyltvjwSh2y3xhJueiRs\n"
2434    +"BiYkyL3/fnocD3pexTdN6h3JgQGgO5GV8zw/NrxA85mw8o9im0HreuFObmNj36T9\n"
2435    +"k5N+R/QIXW83cIQOLaWK1ThYcluytf0tDRiMoKqULiaA6HvDMigExLxuhCtnoF8I\n"
2436    +"iOLN1cPdEVQjzwDHLqXP2DbWW1z9iRepLZlEm1hLRLEmOrTGKezYupVv306SSa6J\n"
2437    +"OA55lAeXMbyjFaYCr54HWrpt4NwNBX1efMUURc+1LcHpzFrBTTLbfjIyq6as49pH\n"
2438    +"-----END RSA PRIVATE KEY-----\n"
2439function TestConvertPemKeyBySync() {
2440  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
2441  try {
2442    let keyPairData = asyKeyGenerator.convertPemKeySync(null, priKeyPkcs1EncodingStr, "123456");
2443    if (keyPairData != null) {
2444      console.info('[Sync]: convert pem key pair success');
2445    } else {
2446      console.error("[Sync]: convert pem key pair result fail!");
2447    }
2448  } catch (e) {
2449    console.error(`Sync error, ${e.code}, ${e.message}`);
2450  }
2451}
2452```
2453
2454## cryptoFramework.createAsyKeyGeneratorBySpec<sup>10+</sup>
2455
2456createAsyKeyGeneratorBySpec(asyKeySpec: AsyKeySpec): AsyKeyGeneratorBySpec
2457
2458指定密钥参数,获取非对称密钥生成器实例。
2459
2460支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。
2461
2462**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2463
2464**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2465
2466API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey2467
2468**参数:**
2469
2470| 参数名  | 类型   | 必填 | 说明                             |
2471| ------- | ------ | ---- | -------------------------------- |
2472| asyKeySpec | [AsyKeySpec](#asykeyspec10) | 是   | 密钥参数。非对称密钥生成器根据指定的这些参数生成公/私钥。 |
2473
2474**返回值:**
2475
2476| 类型                                            | 说明                       |
2477| ----------------------------------------------- | -------------------------- |
2478| [AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10) | 返回非对称密钥生成器实例。 |
2479
2480**错误码:**
2481以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2482
2483| 错误码ID | 错误信息               |
2484| -------- | ---------------------- |
2485| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2486| 801 | this operation is not supported. |
2487| 17620001 | memory operation failed. |
2488
2489**示例:**
2490
2491```ts
2492import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2493
2494// 配置DSA1024公钥和私钥中包含的公共参数。
2495function genDsa1024CommonSpecBigE() {
2496  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
2497    algName: "DSA",
2498    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
2499    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
2500    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
2501    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
2502  }
2503  return dsaCommonSpec;
2504}
2505
2506// 设置DSA1024密钥对中包含的全参数。
2507function genDsa1024KeyPairSpecBigE() {
2508  let dsaCommonSpec = genDsa1024CommonSpecBigE();
2509  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
2510    algName: "DSA",
2511    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
2512    params: dsaCommonSpec,
2513    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
2514    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
2515  }
2516  return dsaKeyPairSpec;
2517}
2518
2519let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
2520let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2521```
2522
2523## AsyKeyGeneratorBySpec<sup>10+</sup>
2524
2525非对称密钥生成器。在使用该类的方法前,需要先使用[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法构建一个AsyKeyGeneratorBySpec实例。
2526
2527### 属性
2528
2529**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2530
2531**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2532
2533API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey2534
2535| 名称    | 类型   | 只读 | 可选 | 说明                       |
2536| ------- | ------ | ---- | ---- | -------------------------- |
2537| algName | string | 是   | 否   | 非对称密钥生成器的算法名。 |
2538
2539### generateKeyPair<sup>10+</sup>
2540
2541generateKeyPair(callback: AsyncCallback\<KeyPair>): void
2542
2543异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。
2544
2545当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。
2546
2547**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2548
2549**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2550
2551API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey2552
2553**参数:**
2554
2555| 参数名     | 类型                    | 必填 | 说明                           |
2556| -------- | ----------------------- | ---- | ------------------------------ |
2557| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
2558
2559**错误码:**
2560以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2561
2562| 错误码ID | 错误信息                |
2563| -------- | ----------------------- |
2564| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types;         |
2565| 17620001 | memory operation failed.           |
2566| 17630001 | crypto operation error. |
2567
2568**示例:**
2569
2570```ts
2571import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2572
2573// 配置DSA1024公钥和私钥中包含的公共参数。
2574function genDsa1024CommonSpecBigE() {
2575  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
2576    algName: "DSA",
2577    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
2578    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
2579    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
2580    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
2581  }
2582  return dsaCommonSpec;
2583}
2584
2585// 设置DSA1024密钥对中包含的全参数。
2586function genDsa1024KeyPairSpecBigE() {
2587  let dsaCommonSpec = genDsa1024CommonSpecBigE();
2588  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
2589    algName: "DSA",
2590    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
2591    params: dsaCommonSpec,
2592    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
2593    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
2594  }
2595  return dsaKeyPairSpec;
2596}
2597
2598function testGenerateKeyPair()
2599{
2600  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
2601  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2602  asyKeyGeneratorBySpec.generateKeyPair((err, keyPair) => {
2603    if (err) {
2604      console.error("generateKeyPair: error.");
2605      return;
2606    }
2607    console.info('generateKeyPair: success.');
2608  })
2609}
2610```
2611
2612### generateKeyPair<sup>10+</sup>
2613
2614generateKeyPair(): Promise\<KeyPair>
2615
2616异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。
2617
2618当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。
2619
2620**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2621
2622**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2623
2624API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey2625
2626**返回值:**
2627
2628| 类型              | 说明                              |
2629| ----------------- | --------------------------------- |
2630| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
2631
2632**错误码:**
2633以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2634
2635| 错误码ID | 错误信息               |
2636| -------- | ---------------------- |
2637| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.        |
2638| 17620001 | memory operation failed.          |
2639| 17630001 | crypto operation error. |
2640
2641**示例:**
2642
2643```ts
2644import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2645import { BusinessError } from '@kit.BasicServicesKit';
2646// 配置DSA1024公钥和私钥中包含的公共参数。
2647function genDsa1024CommonSpecBigE() {
2648  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
2649    algName: "DSA",
2650    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
2651    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
2652    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
2653    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
2654  }
2655  return dsaCommonSpec;
2656}
2657
2658// 设置DSA1024密钥对中包含的全参数。
2659function genDsa1024KeyPairSpecBigE() {
2660  let dsaCommonSpec = genDsa1024CommonSpecBigE();
2661  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
2662    algName: "DSA",
2663    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
2664    params: dsaCommonSpec,
2665    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
2666    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
2667  }
2668  return dsaKeyPairSpec;
2669}
2670
2671function testGenerateKeyPair()
2672{
2673  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
2674  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2675  let keyGenPromise = asyKeyGeneratorBySpec.generateKeyPair();
2676  keyGenPromise.then(keyPair => {
2677    console.info('generateKeyPair success.');
2678  }).catch((error: BusinessError) => {
2679    console.error("generateKeyPair error.");
2680  });
2681}
2682```
2683
2684### generateKeyPairSync<sup>12+</sup>
2685
2686generateKeyPairSync(): KeyPair
2687
2688同步获取该非对称密钥生成器生成的密钥。
2689
2690当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。
2691
2692**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2693
2694**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2695
2696**返回值:**
2697
2698| 类型              | 说明                              |
2699| ----------------- | --------------------------------- |
2700| [KeyPair](#keypair) | 非对称密钥。 |
2701
2702**错误码:**
2703以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2704
2705| 错误码ID | 错误信息               |
2706| -------- | ---------------------- |
2707| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2708| 17620001 | memory operation failed.          |
2709| 17630001 | crypto operation error. |
2710
2711**示例:**
2712
2713```ts
2714import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2715import { BusinessError } from '@kit.BasicServicesKit';
2716
2717// 配置DSA1024公钥和私钥中包含的公共参数。
2718function genDsa1024CommonSpecBigE() {
2719  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
2720    algName: "DSA",
2721    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
2722    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
2723    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
2724    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
2725  }
2726  return dsaCommonSpec;
2727}
2728
2729// 设置DSA1024密钥对中包含的全参数。
2730function genDsa1024KeyPairSpecBigE() {
2731  let dsaCommonSpec = genDsa1024CommonSpecBigE();
2732  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
2733    algName: "DSA",
2734    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
2735    params: dsaCommonSpec,
2736    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
2737    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
2738  }
2739  return dsaKeyPairSpec;
2740}
2741
2742function testGenerateKeyPairSync()
2743{
2744  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
2745  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2746  try {
2747    let keyPairData = asyKeyGeneratorBySpec.generateKeyPairSync();
2748    if (keyPairData != null) {
2749      console.info('[Sync]: key pair success');
2750    } else {
2751      console.error("[Sync]: get key pair result fail!");
2752    }
2753  } catch (error) {
2754    let e: BusinessError = error as BusinessError;
2755    console.error(`sync error, ${e.code}, ${e.message}`);
2756  }
2757}
2758```
2759
2760### generatePriKey<sup>10+</sup>
2761
2762generatePriKey(callback: AsyncCallback\<PriKey>): void
2763
2764异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。
2765
2766使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型密钥参数创建密钥生成器,生成指定私钥。使用[KEY_PAIR_SPEC](#asykeyspectype10)类型密钥参数创建密钥生成器,从生成的密钥对中获取指定私钥。
2767
2768**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2769
2770**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2771
2772API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey2773
2774**参数:**
2775
2776| 参数名     | 类型                    | 必填 | 说明                           |
2777| -------- | ----------------------- | ---- | ------------------------------ |
2778| callback | AsyncCallback\<[PriKey](#prikey)> | 是   | 回调函数,用于获取非对称密钥。 |
2779
2780**错误码:**
2781以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
2782
2783| 错误码ID | 错误信息               |
2784| -------- | ---------------------- |
2785| 401 | invalid parameters. Possible causes: <br>Mandatory parameters are left unspecified;         |
2786| 17620001 | memory operation failed.          |
2787| 17630001 | crypto operation error. |
2788
2789**示例:**
2790
2791```ts
2792import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2793import { BusinessError } from '@kit.BasicServicesKit';
2794
2795// 配置DSA1024公钥和私钥中包含的公共参数。
2796function genDsa1024CommonSpecBigE() {
2797  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
2798    algName: "DSA",
2799    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
2800    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
2801    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
2802    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
2803  }
2804  return dsaCommonSpec;
2805}
2806
2807// 设置DSA1024密钥对中包含的全参数。
2808function genDsa1024KeyPairSpecBigE() {
2809  let dsaCommonSpec = genDsa1024CommonSpecBigE();
2810  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
2811    algName: "DSA",
2812    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
2813    params: dsaCommonSpec,
2814    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
2815    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
2816  }
2817  return dsaKeyPairSpec;
2818}
2819
2820function testGeneratePriKey()
2821{
2822  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
2823  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2824  asyKeyGeneratorBySpec.generatePriKey((err, prikey) => {
2825    if (err) {
2826      console.error("generatePriKey: error.");
2827      return;
2828    }
2829    console.info('generatePriKey: success.');
2830  })
2831}
2832```
2833
2834### generatePriKey<sup>10+</sup>
2835
2836generatePriKey(): Promise\<PriKey>
2837
2838异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。
2839
2840当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。
2841
2842**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2843
2844**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2845
2846API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey2847
2848**返回值:**
2849
2850| 类型              | 说明                              |
2851| ----------------- | --------------------------------- |
2852| Promise\<[PriKey](#prikey)> | 使用Promise的方式获取非对称密钥。 |
2853
2854**错误码:**
2855以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
2856
2857| 错误码ID | 错误信息               |
2858| -------- | ---------------------- |
2859| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2860| 17620001 | memory operation failed.          |
2861| 17630001 | crypto operation error. |
2862
2863**示例:**
2864
2865```ts
2866import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2867import { BusinessError } from '@kit.BasicServicesKit';
2868
2869// 配置DSA1024公钥和私钥中包含的公共参数。
2870function genDsa1024CommonSpecBigE() {
2871  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
2872    algName: "DSA",
2873    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
2874    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
2875    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
2876    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
2877  }
2878  return dsaCommonSpec;
2879}
2880
2881// 设置DSA1024密钥对中包含的全参数。
2882function genDsa1024KeyPairSpecBigE() {
2883  let dsaCommonSpec = genDsa1024CommonSpecBigE();
2884  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
2885    algName: "DSA",
2886    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
2887    params: dsaCommonSpec,
2888    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
2889    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
2890  }
2891  return dsaKeyPairSpec;
2892}
2893
2894function testGeneratePriKey()
2895{
2896  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
2897  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2898  let keyGenPromise = asyKeyGeneratorBySpec.generatePriKey();
2899  keyGenPromise.then(priKey => {
2900    console.info('generatePriKey success.');
2901  }).catch((error: BusinessError) => {
2902    console.error("generatePriKey error.");
2903  });
2904}
2905```
2906
2907### generatePriKeySync<sup>12+</sup>
2908
2909generatePriKeySync(): PriKey
2910
2911同步获取该非对称密钥生成器生成的密钥。
2912
2913当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。
2914
2915**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2916
2917**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2918
2919**返回值:**
2920
2921| 类型              | 说明                              |
2922| ----------------- | --------------------------------- |
2923| [PriKey](#prikey) | 非对称密钥。 |
2924
2925**错误码:**
2926以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2927
2928| 错误码ID | 错误信息               |
2929| -------- | ---------------------- |
2930| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.        |
2931| 17620001 | memory operation failed.          |
2932| 17630001 | crypto operation error. |
2933
2934**示例:**
2935
2936```ts
2937import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2938
2939// 配置DSA1024公钥和私钥中包含的公共参数。
2940function genDsa1024CommonSpecBigE() {
2941  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
2942    algName: "DSA",
2943    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
2944    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
2945    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
2946    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
2947  }
2948  return dsaCommonSpec;
2949}
2950
2951// 设置DSA1024密钥对中包含的全参数。
2952function genDsa1024KeyPairSpecBigE() {
2953  let dsaCommonSpec = genDsa1024CommonSpecBigE();
2954  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
2955    algName: "DSA",
2956    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
2957    params: dsaCommonSpec,
2958    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
2959    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
2960  }
2961  return dsaKeyPairSpec;
2962}
2963
2964function testGeneratePriKeySync()
2965{
2966  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
2967  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2968  try {
2969    let priKeyData = asyKeyGeneratorBySpec.generatePriKeySync();
2970    if (priKeyData != null) {
2971      console.info('[Sync]: pri key success');
2972    } else {
2973      console.error("[Sync]: get pri key result fail!");
2974    }
2975  } catch (e) {
2976    console.error(`sync error, ${e.code}, ${e.message}`);
2977  }
2978}
2979```
2980
2981### generatePubKey<sup>10+</sup>
2982
2983generatePubKey(callback: AsyncCallback\<PubKey>): void
2984
2985异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。
2986
2987当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。
2988
2989**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2990
2991**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2992
2993API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey2994
2995**参数:**
2996
2997| 参数名     | 类型                    | 必填 | 说明                           |
2998| -------- | ----------------------- | ---- | ------------------------------ |
2999| callback | AsyncCallback\<[PubKey](#pubkey)> | 是   | 回调函数,用于获取非对称密钥。 |
3000
3001**错误码:**
3002以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
3003
3004| 错误码ID | 错误信息               |
3005| -------- | ---------------------- |
3006| 401 | invalid parameters. Possible causes:<br> Incorrect parameter types;        |
3007| 17620001 | memory operation failed.          |
3008| 17630001 | crypto operation error. |
3009
3010**示例:**
3011
3012```ts
3013import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3014
3015// 配置DSA1024公钥和私钥中包含的公共参数。
3016function genDsa1024CommonSpecBigE() {
3017  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
3018    algName: "DSA",
3019    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
3020    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
3021    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
3022    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
3023  }
3024  return dsaCommonSpec;
3025}
3026
3027// 设置DSA1024密钥对中包含的全参数。
3028function genDsa1024KeyPairSpecBigE() {
3029  let dsaCommonSpec = genDsa1024CommonSpecBigE();
3030  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
3031    algName: "DSA",
3032    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
3033    params: dsaCommonSpec,
3034    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
3035    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
3036  }
3037  return dsaKeyPairSpec;
3038}
3039
3040function testGeneratePubKey()
3041{
3042  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
3043  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
3044  asyKeyGeneratorBySpec.generatePubKey((err, pubKey) => {
3045    if (err) {
3046      console.error("generatePubKey: error.");
3047      return;
3048    }
3049    console.info('generatePubKey: success.');
3050  })
3051}
3052```
3053
3054### generatePubKey<sup>10+</sup>
3055
3056generatePubKey(): Promise\<PubKey>
3057
3058异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。
3059
3060当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。
3061
3062**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3063
3064**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
3065
3066API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey3067
3068**返回值:**
3069
3070| 类型              | 说明                              |
3071| ----------------- | --------------------------------- |
3072| Promise\<[PubKey](#pubkey)> | 使用Promise的方式获取非对称密钥。 |
3073
3074**错误码:**
3075以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3076
3077| 错误码ID | 错误信息               |
3078| -------- | ---------------------- |
3079| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
3080| 17620001 | memory operation failed.          |
3081| 17630001 | crypto operation error. |
3082
3083**示例:**
3084
3085```ts
3086import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3087import { BusinessError } from '@kit.BasicServicesKit';
3088
3089// 配置DSA1024公钥和私钥中包含的公共参数。
3090function genDsa1024CommonSpecBigE() {
3091  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
3092    algName: "DSA",
3093    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
3094    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
3095    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
3096    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
3097  }
3098  return dsaCommonSpec;
3099}
3100
3101// 设置DSA1024密钥对中包含的全参数。
3102function genDsa1024KeyPairSpecBigE() {
3103  let dsaCommonSpec = genDsa1024CommonSpecBigE();
3104  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
3105    algName: "DSA",
3106    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
3107    params: dsaCommonSpec,
3108    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
3109    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
3110  }
3111  return dsaKeyPairSpec;
3112}
3113
3114function testGeneratePubKey()
3115{
3116  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
3117  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
3118  let keyGenPromise = asyKeyGeneratorBySpec.generatePubKey();
3119  keyGenPromise.then(pubKey => {
3120    console.info('generatePubKey success.');
3121  }).catch((error: BusinessError) => {
3122    console.error("generatePubKey error.");
3123  });
3124}
3125```
3126
3127### generatePubKeySync<sup>12+</sup>
3128
3129generatePubKeySync(): PubKey
3130
3131同步获取该非对称密钥生成器生成的密钥。
3132
3133当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数时,可以从生成的密钥对中获取指定的公钥。
3134
3135**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3136
3137**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
3138
3139**返回值:**
3140
3141| 类型              | 说明                              |
3142| ----------------- | --------------------------------- |
3143| [PubKey](#pubkey) | 非对称密钥。 |
3144
3145**错误码:**
3146以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3147
3148| 错误码ID | 错误信息               |
3149| -------- | ---------------------- |
3150| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.        |
3151| 17620001 | memory operation failed.          |
3152| 17630001 | crypto operation error. |
3153
3154**示例:**
3155
3156```ts
3157import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3158
3159// 配置DSA1024公钥和私钥中包含的公共参数。
3160function genDsa1024CommonSpecBigE() {
3161  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
3162    algName: "DSA",
3163    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
3164    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
3165    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
3166    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
3167  }
3168  return dsaCommonSpec;
3169}
3170
3171// 设置DSA1024密钥对中包含的全参数。
3172function genDsa1024KeyPairSpecBigE() {
3173  let dsaCommonSpec = genDsa1024CommonSpecBigE();
3174  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
3175    algName: "DSA",
3176    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
3177    params: dsaCommonSpec,
3178    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
3179    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
3180  }
3181  return dsaKeyPairSpec;
3182}
3183
3184function testGeneratePubKeySync()
3185{
3186  let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
3187  let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
3188  try {
3189    let pubKeyData = asyKeyGeneratorBySpec.generatePubKeySync();
3190    if (pubKeyData != null) {
3191      console.info('[Sync]: pub key success');
3192    } else {
3193      console.error("[Sync]: get pub key result fail!");
3194    }
3195  } catch (e) {
3196    console.error(`sync error, ${e.code}, ${e.message}`);
3197  }
3198}
3199```
3200
3201## ECCKeyUtil<sup>11+</sup>
3202
3203根据椭圆曲线名生成相应的非对称公共密钥参数。
3204
3205### genECCCommonParamsSpec<sup>11+</sup>
3206
3207static genECCCommonParamsSpec(curveName: string): ECCCommonParamsSpec
3208
3209根据椭圆曲线相应的NID(Name IDentifier)字符串名称生成相应的非对称公共密钥参数。详见[ECC密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#ecc)和[SM2密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#sm2)。
3210
3211**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3212
3213**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
3214
3215API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey3216
3217**参数:**
3218
3219| 参数名  | 类型   | 必填 | 说明                                           |
3220| ------- | ------ | ---- | ---------------------------------------------- |
3221| curveName | string | 是   | 椭圆曲线相应的NID(Name IDentifier)字符串名称。 |
3222
3223**返回值:**
3224
3225| 类型              | 说明                              |
3226| ----------------- | --------------------------------- |
3227| [ECCCommonParamsSpec](#ecccommonparamsspec10) | 返回ECC公共密钥参数。 |
3228
3229**错误码:**
3230以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3231
3232| 错误码ID | 错误信息                         |
3233| -------- | -------------------------------- |
3234| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3235| 801      | this operation is not supported. |
3236| 17620001 | memory operation failed.                    |
3237
3238**示例:**
3239
3240```ts
3241import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3242import { BusinessError } from '@kit.BasicServicesKit';
3243try {
3244    let ECCCommonParamsSpec = cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_brainpoolP160r1');
3245    console.info('genECCCommonParamsSpec success');
3246} catch (err) {
3247    let e: BusinessError = err as BusinessError;
3248    console.error(`genECCCommonParamsSpec error, ${e.code}, ${e.message}`);
3249}
3250```
3251
3252### convertPoint<sup>12+</sup>
3253
3254static convertPoint(curveName: string, encodedPoint: Uint8Array): Point
3255
3256根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),将指定的点数据转换为Point对象。当前支持压缩/非压缩格式的点数据。
3257
3258> **说明:**
3259>
3260> 根据RFC5480规范中第2.2节的描述:<br/>
3261> 1. 非压缩的点数据,表示为:前缀0x04\|x坐标\|y坐标;
3262> 2. 压缩的点数据,对于Fp素数域上的点(当前暂不支持F2m域),表示为:前缀0x03\|x坐标 (坐标y是奇数时),前缀0x02\|x坐标 (坐标y是偶数时)。
3263
3264**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3265
3266**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
3267
3268**参数:**
3269
3270| 参数名       | 类型        | 必填 | 说明                                           |
3271| ------------ | ---------- | ---- | ---------------------------------------------- |
3272| curveName    | string     | 是   | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 |
3273| encodedPoint | Uint8Array | 是   | 指定的ECC椭圆曲线上的点的数据。 |
3274
3275**返回值:**
3276
3277| 类型              | 说明                 |
3278| ----------------- | ------------------- |
3279| [Point](#point10) | 返回ECC的Point对象。 |
3280
3281**错误码:**
3282以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3283
3284| 错误码ID | 错误信息               |
3285| -------- | ---------------------- |
3286| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3287| 17620001 | memory operation failed. |
3288| 17630001 | crypto operation error. |
3289
3290**示例:**
3291
3292```ts
3293import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3294
3295// 随机生成的非压缩点数据。
3296let pkData = new Uint8Array([4, 143, 39, 57, 249, 145, 50, 63, 222, 35, 70, 178, 121, 202, 154, 21, 146, 129, 75, 76, 63, 8, 195, 157, 111, 40, 217, 215, 148, 120, 224, 205, 82, 83, 92, 185, 21, 211, 184, 5, 19, 114, 33, 86, 85, 228, 123, 242, 206, 200, 98, 178, 184, 130, 35, 232, 45, 5, 202, 189, 11, 46, 163, 156, 152]);
3297let returnPoint = cryptoFramework.ECCKeyUtil.convertPoint('NID_brainpoolP256r1', pkData);
3298console.info('returnPoint: ' + returnPoint.x.toString(16));
3299```
3300
3301### getEncodedPoint<sup>12+</sup>
3302
3303static getEncodedPoint(curveName: string, point: Point, format: string): Uint8Array
3304
3305根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),按照指定的点数据格式,将Point对象转换为点数据。当前支持压缩/非压缩格式的点数据。
3306
3307**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3308
3309**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
3310
3311**参数:**
3312
3313| 参数名       | 类型               | 必填 | 说明                                           |
3314| ------------ | ----------------- | ---- | ---------------------------------------------- |
3315| curveName    | string            | 是   | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 |
3316| point        | [Point](#point10) | 是   | 椭圆曲线上的Point点对象。 |
3317| format       | string            | 是   | 需要获取的点数据格式,当前支持"COMPRESSED"或"UNCOMPRESSED"。 |
3318
3319**返回值:**
3320
3321| 类型              | 说明                              |
3322| ----------------- | --------------------------------- |
3323| Uint8Array | 返回指定格式的点数据。 |
3324
3325**错误码:**
3326以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3327
3328| 错误码ID | 错误信息               |
3329| -------- | ---------------------- |
3330| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3331| 17620001 | memory operation failed. |
3332| 17630001 | crypto operation error. |
3333
3334**示例:**
3335
3336```ts
3337import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3338
3339async function doTest() {
3340  let generator = cryptoFramework.createAsyKeyGenerator('ECC_BrainPoolP256r1');
3341  let keyPair = await generator.generateKeyPair();
3342  let eccPkX = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_X_BN);
3343  let eccPkY = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_Y_BN);
3344  console.info('ECC_PK_X_BN 16:' + eccPkX.toString(16));
3345  console.info('ECC_PK_Y_BN 16:' + eccPkY.toString(16));
3346  // 将eccPkX.toString(16)结果放入x,eccPkY.toString(16)结果放入y。
3347  let returnPoint: cryptoFramework.Point = {
3348    x: BigInt('0x' + eccPkX.toString(16)),
3349    y: BigInt('0x' + eccPkY.toString(16))
3350  };
3351  let returnData = cryptoFramework.ECCKeyUtil.getEncodedPoint('NID_brainpoolP256r1', returnPoint, 'UNCOMPRESSED');
3352  console.info('returnData: ' + returnData);
3353}
3354```
3355
3356## DHKeyUtil<sup>11+</sup>
3357
3358根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。
3359
3360### genDHCommonParamsSpec<sup>11+</sup>
3361
3362static genDHCommonParamsSpec(pLen: number, skLen?: number): DHCommonParamsSpec
3363
3364根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。详见[DH密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#dh)。
3365
3366**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3367
3368**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
3369
3370API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey3371
3372**参数:**
3373
3374| 参数名 | 类型   | 必填 | 说明                                             |
3375| ------ | ------ | ---- | ------------------------------------------------ |
3376| pLen   | number | 是   | 用于指定DH公共密钥参数中素数P的长度,单位为bit。 |
3377| skLen  | number | 否   | 用于指定DH公共密钥参数中私钥的长度,单位为bit。  |
3378
3379**返回值:**
3380
3381| 类型              | 说明                              |
3382| ----------------- | --------------------------------- |
3383| [DHCommonParamsSpec](#dhcommonparamsspec11) | 返回DH公共密钥参数。 |
3384
3385**错误码:**
3386以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3387
3388| 错误码ID | 错误信息                         |
3389| -------- | -------------------------------- |
3390| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3391| 801      | this operation is not supported. |
3392| 17620001 | memory operation failed.                    |
3393| 17630001 | crypto operation error.          |
3394
3395**示例:**
3396
3397```ts
3398import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3399import { BusinessError } from '@kit.BasicServicesKit';
3400try {
3401    let DHCommonParamsSpec = cryptoFramework.DHKeyUtil.genDHCommonParamsSpec(2048);
3402    console.info('genDHCommonParamsSpec success');
3403} catch (err) {
3404    let e: BusinessError = err as BusinessError;
3405    console.error(`genDHCommonParamsSpec error, ${e.code}, ${e.message}`);
3406}
3407```
3408
3409## SM2CryptoUtil<sup>12+</sup>
3410
3411用于SM2密码学运算的工具类。
3412
3413### genCipherTextBySpec<sup>12+</sup>
3414
3415static genCipherTextBySpec(spec: SM2CipherTextSpec, mode?: string): DataBlob
3416
3417根据指定的SM2密文参数,生成符合国密标准的ASN.1格式SM2密文。
3418
3419**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3420
3421**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3422
3423**参数:**
3424
3425| 参数名 | 类型   | 必填 | 说明                                             |
3426| ------ | ------ | ---- | ------------------------------------------------ |
3427| spec   | [SM2CipherTextSpec](#sm2ciphertextspec12) | 是   | 指定的SM2密文参数。 |
3428| mode  | string | 否   | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。  |
3429
3430**返回值:**
3431
3432| 类型              | 说明                              |
3433| ----------------- | --------------------------------- |
3434| [DataBlob](#datablob) | 返回符合国密标准的ASN.1格式的SM2密文。 |
3435
3436**错误码:**
3437以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3438
3439| 错误码ID | 错误信息                         |
3440| -------- | -------------------------------- |
3441| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3442| 17620001 | memory operation failed.                    |
3443| 17630001 | crypto operation error.          |
3444
3445**示例:**
3446
3447```ts
3448import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3449import { BusinessError } from '@kit.BasicServicesKit';
3450try {
3451  let spec : cryptoFramework.SM2CipherTextSpec = {
3452    xCoordinate: BigInt('20625015362595980457695435345498579729138244358573902431560627260141789922999'),
3453    yCoordinate: BigInt('48563164792857017065725892921053777369510340820930241057309844352421738767712'),
3454    cipherTextData: new Uint8Array([100,227,78,195,249,179,43,70,242,69,169,10,65,123]),
3455    hashData: new Uint8Array([87,167,167,247,88,146,203,234,83,126,117,129,52,142,82,54,152,226,201,111,143,115,169,125,128,42,157,31,114,198,109,244]),
3456  }
3457  let data = cryptoFramework.SM2CryptoUtil.genCipherTextBySpec(spec, 'C1C3C2');
3458  console.info('genCipherTextBySpec success');
3459} catch (err) {
3460  let e: BusinessError = err as BusinessError;
3461  console.error(`genCipherTextBySpec error, ${e.code}, ${e.message}`);
3462}
3463```
3464
3465### getCipherTextSpec<sup>12+</sup>
3466
3467static getCipherTextSpec(cipherText: DataBlob, mode?: string): SM2CipherTextSpec
3468
3469从符合国密标准的ASN.1格式的SM2密文中,获取具体的SM2密文参数。
3470
3471**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3472
3473**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3474
3475**参数:**
3476
3477| 参数名 | 类型   | 必填 | 说明                                             |
3478| ------ | ------ | ---- | ------------------------------------------------ |
3479| cipherText     | [DataBlob](#datablob)                 | 是   | 符合国密标准的ASN.1格式的SM2密文。
3480| mode  | string | 否   | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。  |
3481
3482**返回值:**
3483
3484| 类型              | 说明                              |
3485| ----------------- | --------------------------------- |
3486| [SM2CipherTextSpec](#sm2ciphertextspec12) | 返回SM2密文参数。 |
3487
3488**错误码:**
3489以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3490
3491| 错误码ID | 错误信息                         |
3492| -------- | -------------------------------- |
3493| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3494| 17620001 | memory operation failed.                    |
3495| 17630001 | crypto operation error.          |
3496
3497```ts
3498import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3499import { BusinessError } from '@kit.BasicServicesKit';
3500try {
3501    let cipherTextArray = new Uint8Array([48,118,2,32,45,153,88,82,104,221,226,43,174,21,122,248,5,232,105,41,92,95,102,224,216,149,85,236,110,6,64,188,149,70,70,183,2,32,107,93,198,247,119,18,40,110,90,156,193,158,205,113,170,128,146,109,75,17,181,109,110,91,149,5,110,233,209,78,229,96,4,32,87,167,167,247,88,146,203,234,83,126,117,129,52,142,82,54,152,226,201,111,143,115,169,125,128,42,157,31,114,198,109,244,4,14,100,227,78,195,249,179,43,70,242,69,169,10,65,123]);
3502    let cipherText : cryptoFramework.DataBlob = {data : cipherTextArray};
3503    let spec : cryptoFramework.SM2CipherTextSpec = cryptoFramework.SM2CryptoUtil.getCipherTextSpec(cipherText, 'C1C3C2');
3504    console.info('getCipherTextSpec success');
3505} catch (err) {
3506    let e: BusinessError = err as BusinessError;
3507    console.error(`getCipherTextSpec error, ${e.code}, ${e.message}`);
3508}
3509```
3510
3511## cryptoFramework.createCipher
3512
3513createCipher(transformation: string): Cipher
3514
3515通过指定算法名称,获取相应的[Cipher](#cipher)实例。
3516
3517支持的规格详见[对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-sym-encrypt-decrypt-spec.md)和[非对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md)。
3518
3519**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3520
3521**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3522
3523API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher3524
3525**参数:**
3526
3527| 参数名         | 类型   | 必填 | 说明                                                         |
3528| -------------- | ------ | ---- | ------------------------------------------------------------ |
3529| transformation | string | 是   | 待生成Cipher的算法名称(含密钥长度)、加密模式以及填充方法的组合。 |
3530
3531> **说明:**
3532>
3533> 1. 目前对称加解密中,PKCS5和PKCS7的实现相同,其padding长度和分组长度保持一致。在3DES中均按8字节填充,在AES中均按16字节填充。另有NoPadding表示不填充。
3534> <br/>开发者需要自行了解密码学不同分组模式的差异,以便选择合适的参数规格。例如选择ECB和CBC模式时,建议启用填充,否则必须确保明文长度是分组大小的整数倍;选择其他模式时,可以不启用填充,此时密文长度和明文长度一致(即可能不是分组大小的整数倍)。
3535> 2. 使用RSA或SM2进行非对称加解密时,必须创建两个Cipher对象,分别进行加密和解密操作,不能对同一个Cipher对象进行加解密。对称加解密没有此要求,只要算法规格一致,可以对同一个Cipher对象进行加解密操作。
3536
3537**返回值:**
3538
3539| 类型              | 说明                     |
3540| ----------------- | ------------------------ |
3541| [Cipher](#cipher) | 返回加解密生成器的对象。 |
3542
3543**错误码:**
3544以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
3545
3546| 错误码ID | 错误信息               |
3547| -------- | ---------------------- |
3548| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3549| 801 | this operation is not supported. |
3550| 17620001 | memory operation failed.          |
3551
3552**示例:**
3553
3554```ts
3555import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3556import { BusinessError } from '@kit.BasicServicesKit';
3557
3558let cipherAlgName = '3DES192|ECB|PKCS7';
3559try {
3560  let cipher = cryptoFramework.createCipher(cipherAlgName);
3561  console.info('cipher algName:' + cipher.algName);
3562} catch (error) {
3563  let e: BusinessError = error as BusinessError;
3564  console.error(`sync error, ${e.code}, ${e.message}`);
3565}
3566```
3567
3568## Cipher
3569
3570提供加解密的算法操作功能,按序调用本类中的[init()](#init-1)、[update()](#update)、[doFinal()](#dofinal)方法,可以实现对称加密/对称解密/非对称加密/非对称解密。
3571
3572完整的加解密流程示例可参考[开发指南](../../security/CryptoArchitectureKit/crypto-encryption-decryption-overview.md)。
3573
3574一次完整的加/解密流程在对称加密和非对称加密中略有不同:
3575
3576- 对称加解密:init为必选,update为可选(且允许多次update加/解密大数据),doFinal为必选;doFinal结束后可以重新init开始新一轮加/解密流程。
3577- RSA、SM2非对称加解密:init为必选,不支持update操作,doFinal为必选(允许连续多次doFinal加/解密大数据);RSA不支持重复init,切换加解密模式或填充方式时,需要重新创建Cipher对象。
3578
3579### 属性
3580
3581**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3582
3583**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3584
3585API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher3586
3587| 名称    | 类型   | 只读 | 可选 | 说明                         |
3588| ------- | ------ | ---- | ---- | ---------------------------- |
3589| algName | string | 是   | 否   | 加解密生成器指定的算法名称。 |
3590
3591### init
3592
3593init(opMode: CryptoMode, key: Key, params: ParamsSpec | null, callback: AsyncCallback\<void>): void
3594
3595初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。
3596
3597必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
3598
3599**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3600
3601**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3602
3603API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher3604
3605**参数:**
3606
3607| 参数名     | 类型                      | 必填 | 说明                                                         |
3608| -------- | ------------------------- | ---- | ------------------------------------------------------------ |
3609| opMode   | [CryptoMode](#cryptomode) | 是   | 加密或者解密模式。                                           |
3610| key      | [Key](#key)               | 是   | 指定加密或解密的密钥。                                       |
3611| params   | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前只支持ParamsSpec, API 10之后增加支持null。 |
3612| callback | AsyncCallback\<void>      | 是   | 回调函数。当加解密初始化成功,err为undefined,否则为错误对象。     |
3613
3614**错误码:**
3615以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
3616
3617| 错误码ID | 错误信息                                                 |
3618| -------- | --------------------------------------------------------- |
3619| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3620| 17620001 | memory operation failed.                                            |
3621| 17620002 | failed to convert parameters between arkts and c.                                          |
3622| 17630001 | crypto operation error.|
3623
3624### init
3625
3626init(opMode: CryptoMode, key: Key, params: ParamsSpec | null): Promise\<void>
3627
3628初始化加解密的cipher对象,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。
3629
3630必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
3631
3632**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3633
3634**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3635
3636API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher3637
3638**参数:**
3639
3640| 参数名   | 类型                      | 必填 | 说明                                                         |
3641| ------ | ------------------------- | ---- | ------------------------------------------------------------ |
3642| opMode | [CryptoMode](#cryptomode) | 是   | 加密或者解密模式。                                           |
3643| key    | [Key](#key)               | 是   | 指定加密或解密的密钥。                                       |
3644| params | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前仅支持ParamsSpec,从API 10开始增加对null的支持。 |
3645
3646**返回值:**
3647
3648| 类型           | 说明                                   |
3649| -------------- | -------------------------------------- |
3650| Promise\<void> | 无返回结果的Promise对象。 |
3651
3652**错误码:**
3653以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3654
3655| 错误码ID | 错误信息                                          |
3656| -------- | ------------------------------------------------- |
3657| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3658| 17620001 | memory operation failed.                                     |
3659| 17620002 | failed to convert parameters between arkts and c.                                    |
3660| 17630001 | crypto operation error.|
3661
3662### initSync<sup>12+</sup>
3663
3664initSync(opMode: CryptoMode, key: Key, params: ParamsSpec | null): void
3665
3666初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。
3667
3668必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
3669
3670**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3671
3672**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3673
3674**参数:**
3675
3676| 参数名 | 类型                                            | 必填 | 说明                                                         |
3677| ------ | ----------------------------------------------- | ---- | ------------------------------------------------------------ |
3678| opMode | [CryptoMode](#cryptomode)                       | 是   | 加密或者解密模式。                                           |
3679| key    | [Key](#key)                                     | 是   | 指定加密或解密的密钥。                                       |
3680| params | [ParamsSpec](#paramsspec)  \| null| 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 |
3681
3682**错误码:**
3683以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3684
3685| 错误码ID | 错误信息                |
3686| -------- | ----------------------- |
3687| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3688| 17620001 | memory operation failed.           |
3689| 17620002 | failed to convert parameters between arkts and c.         |
3690| 17630001 | crypto operation error. |
3691
3692### update
3693
3694update(data: DataBlob, callback: AsyncCallback\<DataBlob>): void
3695
3696分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。
3697
3698必须在对[Cipher](#cipher)实例使用[init()](#init-1)初始化后,才能使用本函数。
3699
3700> **说明:**
3701>
3702> 1. 在进行对称加解密操作时,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果进行判断,确保其不为null,并在结果不为null时取出数据进行拼接,形成完整的密文或明文。这是因选择的分组模式等各项规格可能对update和doFinal的结果产生影响。
3703>
3704>    例如,对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组为单位进行加解密,并输出本次update新产生的加解密分组结果。
3705>
3706>    可以理解为update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,将当前未被加解密的数据留着,等下一次update或doFinal传入数据时,拼接起来继续凑分组。
3707>
3708>    最后doFinal时,会将剩下的未加解密的数据根据[createCipher](#cryptoframeworkcreatecipher)时设置的填充模式进行填充,补齐到分组的整数倍长度,再输出剩余的加解密结果。
3709>
3710>    对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度与明文长度相同的情况。
3711>
3712> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。
3713>
3714>    算法库未对单次或累计的update数据量设置限制。对于大数据量的对称加解密操作,建议分多次调用update方法传入数据。
3715>
3716>    AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。
3717> 3. RSA、SM2非对称加解密不支持update操作。
3718> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。
3719
3720**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3721
3722**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3723
3724API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher3725
3726**参数:**
3727
3728| 参数名     | 类型                                  | 必填 | 说明                                                         |
3729| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
3730| data     | [DataBlob](#datablob)                 | 是   | 需要进行加密或解密的数据。data不能为null。           |
3731| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。更新加/解密数据成功时,err为undefined,data为DataBlob;否则为错误对象。 |
3732
3733**错误码:**
3734以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3735
3736| 错误码ID | 错误信息                                    |
3737| -------- | ------------------------------------------- |
3738| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3739| 17620001 | memory operation failed.                               |
3740| 17620002 | failed to convert parameters between arkts and c.                            |
3741| 17630001 | crypto operation error.                     |
3742
3743### update
3744
3745update(data: DataBlob): Promise\<DataBlob>
3746
3747分段更新加密或者解密数据操作,通过Promise获取加/解密数据。
3748
3749必须在对[Cipher](#cipher)实例使用[init()](#init-1)初始化后,才能使用本函数。
3750
3751> **说明:**
3752>
3753> 1. 在进行对称加解密操作时,如果开发者对各分组模式不够熟悉,建议每次调用update和doFinal后,都判断结果是否为null。如果结果不为null,则取出其中的数据进行拼接,以形成完整的密文或明文。这是因为选择的分组模式等各项规格可能会影响update和doFinal的结果。
3754> <br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。)
3755> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。<br/>
3756>    算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,可以采用多次update的方式传入数据。<br/>
3757>    AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。
3758> 3. RSA、SM2非对称加解密不支持update操作。
3759> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。
3760
3761**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3762
3763**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3764
3765API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher3766
3767**参数:**
3768
3769| 参数名 | 类型                  | 必填 | 说明                 |
3770| ---- | --------------------- | ---- | -------------------- |
3771| data | [DataBlob](#datablob) | 是   | 加密或者解密的数据。data不能为null。 |
3772
3773**返回值:**
3774
3775| 类型                            | 说明                                             |
3776| ------------------------------- | ------------------------------------------------ |
3777| Promise\<[DataBlob](#datablob)> | Promise对象,返回此次更新的加/解密结果DataBlob。 |
3778
3779**错误码:**
3780以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3781
3782| 错误码ID | 错误信息                                     |
3783| -------- | -------------------------------------------- |
3784| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3785| 17620001 | memory operation failed.                                |
3786| 17620002 | failed to convert parameters between arkts and c.                               |
3787| 17630001 | crypto operation error.                      |
3788
3789### updateSync<sup>12+</sup>
3790
3791updateSync(data: DataBlob): DataBlob
3792
3793分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。
3794
3795必须在对[Cipher](#cipher)实例使用[initSync()](#initsync12)初始化后,才能使用本函数。
3796
3797其他注意事项同上异步接口说明。
3798
3799**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3800
3801**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3802
3803**参数:**
3804
3805| 参数名 | 类型                  | 必填 | 说明                                                         |
3806| ------ | --------------------- | ---- | ------------------------------------------------------------ |
3807| data   | [DataBlob](#datablob) | 是   | 加密或者解密的数据。data不能为null。 |
3808
3809**返回值:**
3810
3811| 类型                            | 说明                                             |
3812| ------------------------------- | ------------------------------------------------ |
3813| [DataBlob](#datablob) | 返回此次更新的加/解密结果DataBlob。 |
3814
3815**错误码:**
3816以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3817
3818| 错误码ID | 错误信息                |
3819| -------- | ----------------------- |
3820| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3821| 17620001 | memory operation failed.           |
3822| 17620002 | failed to convert parameters between arkts and c.         |
3823| 17630001 | crypto operation error. |
3824
3825### doFinal
3826
3827doFinal(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void
3828
3829(1)在对称加解密中doFinal用于处理剩余数据和本次传入的数据,并最终结束加密或解密操作,通过注册回调函数获取加密或解密后的数据。如果数据量较小,可以在 `doFinal` 中一次性传入数据,而不使用update;如果在本次加解密流程中已经使用[update](#update)传入过数据,可以在doFinal的data参数处传入null。根据对称加解密的模式不同,doFinal的输出有以下区别:
3830
3831- 在GCM和CCM模式的对称加密中,一次加密流程中,将每次update和doFinal的结果拼接起来,会得到“密文 + authTag”。GCM模式下,authTag为末尾的16字节;CCM模式下,authTag为末尾的12字节。其余部分均为密文。如果doFinal的data参数传入null,则doFinal的结果就是authTag。解密时,authTag需要填入[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec),密文作为解密时的data参数。
3832- 对于其他模式的对称加解密及GCM和CCM模式的对称解密:每次加/解密流程中,update和doFinal的结果拼接起来,得到完整的明文或密文。
3833
3834
3835(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。
3836
3837> **说明:**
3838>
3839>  1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用init()并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。
3840>  2. 如果遇到解密失败,需检查加解密数据和init时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。
3841>  3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。<br/>
3842>    对于加密,CFB、OFB和CTR模式,如果doFinal传null, 则返回结果为null。<br/>
3843>    对于解密,GCM、CCM、CFB、OFB和CTR模式,如果doFinal传null,则返回结果为null;对于解密,其他模式,如果明文是加密块大小的整倍数,调用update传入所有密文,调用doFinal传null, 则返回结果为null。<br/>
3844>  4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。
3845
3846**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3847
3848**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3849
3850API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher3851
3852**参数:**
3853
3854| 参数名     | 类型                                  | 必填 | 说明                                                         |
3855| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
3856| data     | [DataBlob](#datablob) \| null<sup>10+</sup>                 | 是   | 加密或解密的数据。在对称加解密中可为null,但不可传入{data: Uint8Array(空) }。API 10前仅支持DataBlob,API 10后增加null支持。       |
3857| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。最终加/解密成功时,err为undefined,data为加/解密结果DataBlob;否则为错误对象。 |
3858
3859**错误码:**
3860以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
3861
3862| 错误码ID | 错误信息                |
3863| -------- | ----------------------- |
3864| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3865| 17620001 | memory operation failed.           |
3866| 17620002 | failed to convert parameters between arkts and c.          |
3867| 17630001 | crypto operation error. |
3868
3869**以AES GCM模式加密为例:**
3870
3871更多加解密流程的完整示例请参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。
3872
3873```ts
3874import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3875import { buffer } from '@kit.ArkTS';
3876
3877function generateRandom(len: number) {
3878  let rand = cryptoFramework.createRandom();
3879  let generateRandSync = rand.generateRandomSync(len);
3880  return generateRandSync;
3881}
3882
3883function genGcmParamsSpec() {
3884  let ivBlob = generateRandom(12);
3885  let arr = [1, 2, 3, 4, 5, 6, 7, 8];
3886  let dataAad = new Uint8Array(arr);
3887  let aadBlob: cryptoFramework.DataBlob = { data: dataAad };
3888  arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
3889  let dataTag = new Uint8Array(arr);
3890  let tagBlob: cryptoFramework.DataBlob = {
3891    data: dataTag
3892  };
3893  let gcmParamsSpec: cryptoFramework.GcmParamsSpec = {
3894    iv: ivBlob,
3895    aad: aadBlob,
3896    authTag: tagBlob,
3897    algName: "GcmParamsSpec"
3898  };
3899  return gcmParamsSpec;
3900}
3901
3902function cipherByCallback() {
3903  let gcmParams = genGcmParamsSpec();
3904  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
3905  let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7');
3906  symKeyGenerator.generateSymKey((err, symKey) => {
3907    cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams, (err) => {
3908      let message = "This is a test";
3909      let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
3910      cipher.update(plainText, (err, encryptUpdate) => {
3911        cipher.doFinal(null, (err, tag) => {
3912          gcmParams.authTag = tag;
3913          console.info('encryptUpdate plainText:' + encryptUpdate.data);
3914        });
3915      });
3916    });
3917  });
3918}
3919```
3920
3921### doFinal
3922
3923doFinal(data: DataBlob | null): Promise\<DataBlob>
3924
3925(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过Promise获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用update传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别:
3926
3927- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
3928- 对于其他模式的对称加解密及GCM和CCM模式的对称解密:一次加解密流程中,每次update和doFinal的结果拼接起来,得到完整的明文或密文。
3929
3930(2)在RSA和SM2非对称加解密中,使用doFinal方法加解密传入的数据,并通过Promise获取加密或解密结果。如果数据量较大,可以多次调用doFinal,拼接结果以获得完整的明文或密文。
3931
3932> **说明:**
3933>
3934>  1. 对称加解密中,调用doFinal标志着一次加解密流程完成,[Cipher](#cipher)实例状态被清除。因此,后续开启新流程时,需重新调用init并传入完整参数列表进行初始化。
3935>
3936>     即使是对同一个Cipher实例,使用相同对称密钥,进行加密后解密时,调用init仍需填写params参数,不能省略为null。
3937>  2. 如果遇到解密失败,检查加解密数据和初始化时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec。
3938>  3. doFinal的结果可能为null,因此在使用.data字段访问doFinal结果的具体数据前,请先判断结果是否为null,以避免产生异常。
3939>
3940>     对于加密,CFB、OFB 和 CTR 模式,如果doFinal传入null,则返回结果为null。
3941>
3942>     对于解密,GCM、CCM、CFB、OFB和CTR模式,如果doFinal传null,则返回结果为null;对于其他模式,如果明文是加密块大小的整倍数,调用update传入所有密文,调用doFinal传null, 则返回结果为null。
3943>  4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。
3944
3945**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3946
3947**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3948
3949API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher3950
3951**参数:**
3952
3953| 参数名 | 类型                  | 必填 | 说明                 |
3954| ---- | --------------------- | ---- | -------------------- |
3955| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 加密或者解密的数据。data参数允许为null,但不允许传入{data: Uint8Array(空) }。API 10之前只支持DataBlob,API 10之后增加支持null。 |
3956
3957**返回值:**
3958
3959| 类型                            | 说明                                             |
3960| ------------------------------- | ------------------------------------------------ |
3961| Promise\<[DataBlob](#datablob)> | Promise对象,返回剩余数据的加/解密结果DataBlob。 |
3962
3963**错误码:**
3964以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3965
3966| 错误码ID | 错误信息                                     |
3967| -------- | -------------------------------------------- |
3968| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3969| 17620001 | memory operation failed.                                |
3970| 17620002 | failed to convert parameters between arkts and c.                               |
3971| 17630001 | crypto operation error.                      |
3972
3973**以AES GCM模式加密为例:**
3974
3975此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。
3976
3977```ts
3978import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3979import { buffer } from '@kit.ArkTS';
3980
3981function generateRandom(len: number) {
3982  let rand = cryptoFramework.createRandom();
3983  let generateRandSync = rand.generateRandomSync(len);
3984  return generateRandSync;
3985}
3986
3987function genGcmParamsSpec() {
3988  let ivBlob = generateRandom(12);
3989  let arr = [1, 2, 3, 4, 5, 6, 7, 8];
3990  let dataAad = new Uint8Array(arr);
3991  let aadBlob: cryptoFramework.DataBlob = { data: dataAad };
3992  arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
3993  let dataTag = new Uint8Array(arr);
3994  let tagBlob: cryptoFramework.DataBlob = {
3995    data: dataTag
3996  };
3997  let gcmParamsSpec: cryptoFramework.GcmParamsSpec = {
3998    iv: ivBlob,
3999    aad: aadBlob,
4000    authTag: tagBlob,
4001    algName: "GcmParamsSpec"
4002  };
4003  return gcmParamsSpec;
4004}
4005
4006async function cipherByPromise() {
4007  let gcmParams = genGcmParamsSpec();
4008  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
4009  let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7');
4010  let symKey = await symKeyGenerator.generateSymKey();
4011  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams);
4012  let message = "This is a test";
4013  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
4014  let encryptUpdate = await cipher.update(plainText);
4015  gcmParams.authTag = await cipher.doFinal(null);
4016  console.info('encryptUpdate plainText: ' + encryptUpdate.data);
4017}
4018```
4019
4020### doFinalSync<sup>12+</sup>
4021
4022doFinalSync(data: DataBlob | null): DataBlob
4023
4024(1)在对称加解密中,doFinalSync用于处理剩余数据和本次传入的数据,并结束加密或解密操作,通过注册回调函数获取加密或解密结果。
4025
4026如果数据量较小,可以在doFinalSync中一次性传入数据,而不使用updateSync。如果在本次加解密流程中已经使用[updateSync](#updatesync12)传入过数据,可以在doFinalSync的data参数处传入null。
4027
4028根据对称加解密的模式不同,doFinalSync的输出有以下区别:
4029
4030- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每次updateSync和doFinalSync的结果拼接起来,会得到“密文 + authTag”。即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,其余部分均为密文。也就是说,如果doFinalSync的data参数传入null,则doFinalSync的结果就是 authTag。
4031
4032  authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
4033- 对于其他模式的对称加解密以及GCM和CCM模式的对称解密:在一次加/解密流程中,每次updateSync和doFinalSync的结果拼接起来,得到完整的明文或密文。
4034
4035(2)在RSA和SM2非对称加解密中,doFinalSync用于加解密本次传入的数据,通过注册回调函数获取加密或解密后的数据。如果数据量超过单次处理能力,可以多次调用doFinalSync,并将结果拼接以获得完整的明文或密文。
4036
4037其他注意事项同接口[doFinal()](#dofinal)说明。
4038
4039**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4040
4041**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
4042
4043**参数:**
4044
4045| 参数名 | 类型                                        | 必填 | 说明                                                         |
4046| ------ | ------------------------------------------- | ---- | ------------------------------------------------------------ |
4047| data   | [DataBlob](#datablob)  \| null| 是   | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。 |
4048
4049**返回值:**
4050
4051| 类型                            | 说明                                             |
4052| ------------------------------- | ------------------------------------------------ |
4053| [DataBlob](#datablob) | 返回剩余数据的加/解密结果DataBlob。 |
4054
4055**错误码:**
4056以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
4057
4058| 错误码ID | 错误信息                |
4059| -------- | ----------------------- |
4060| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4061| 17620001 | memory operation failed.           |
4062| 17620002 | failed to convert parameters between arkts and c.          |
4063| 17630001 | crypto operation error. |
4064
4065**以AES GCM模式加密为例:**
4066
4067此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。
4068
4069```ts
4070import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4071import { buffer } from '@kit.ArkTS';
4072
4073function generateRandom(len: number) {
4074  let rand = cryptoFramework.createRandom();
4075  let generateRandSync = rand.generateRandomSync(len);
4076  return generateRandSync;
4077}
4078
4079function genGcmParamsSpec() {
4080  let ivBlob = generateRandom(12);
4081  let arr = [1, 2, 3, 4, 5, 6, 7, 8];
4082  let dataAad = new Uint8Array(arr);
4083  let aadBlob: cryptoFramework.DataBlob = { data: dataAad };
4084  arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
4085  let dataTag = new Uint8Array(arr);
4086  let tagBlob: cryptoFramework.DataBlob = {
4087    data: dataTag
4088  };
4089  let gcmParamsSpec: cryptoFramework.GcmParamsSpec = {
4090    iv: ivBlob,
4091    aad: aadBlob,
4092    authTag: tagBlob,
4093    algName: "GcmParamsSpec"
4094  };
4095  return gcmParamsSpec;
4096}
4097
4098async function cipherBySync() {
4099  let gcmParams = genGcmParamsSpec();
4100  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
4101  let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7');
4102  let symKey = await symKeyGenerator.generateSymKey();
4103  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams);
4104  let message = "This is a test";
4105  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
4106  let encryptUpdate = cipher.updateSync(plainText);
4107  gcmParams.authTag = cipher.doFinalSync(null);
4108  console.info('encryptUpdate plainText: ' + encryptUpdate.data);
4109}
4110
4111```
4112
4113### setCipherSpec<sup>10+</sup>
4114
4115setCipherSpec(itemType: CipherSpecItem, itemValue: Uint8Array): void
4116
4117设置加解密参数。常用的加解密参数可以直接通过[createCipher](#cryptoframeworkcreatecipher) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。
4118
4119**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4120
4121**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
4122
4123API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher4124
4125**参数:**
4126
4127| 参数名   | 类型                 | 必填 | 说明       |
4128| -------- | -------------------- | ---- | ---------- |
4129| itemType     | [CipherSpecItem](#cipherspecitem10)           | 是   | 用于指定需要设置的加解密参数。 |
4130| itemValue | Uint8Array | 是   | 用于指定加解密参数的具体值。 |
4131
4132**错误码:**
4133以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
4134
4135| 错误码ID | 错误信息               |
4136| -------- | ---------------------- |
4137| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4138| 801 | this operation is not supported.          |
4139| 17620001 | memory operation failed.          |
4140| 17630001 | crypto operation error. |
4141
4142**示例:**
4143
4144```ts
4145import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4146function testsetCipherSpec() {
4147  let cipher = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1");
4148  let pSource = new Uint8Array([1,2,3,4]);
4149  cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource);
4150}
4151```
4152
4153### getCipherSpec<sup>10+</sup>
4154
4155getCipherSpec(itemType: CipherSpecItem): string | Uint8Array
4156
4157获取加解密参数。当前只支持RSA算法和SM2算法,从API version 11开始,支持SM2算法获取加解密参数。
4158
4159**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4160
4161**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
4162
4163API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher4164
4165**参数:**
4166
4167| 参数名 | 类型     | 必填 | 说明       |
4168| ------ | -------- | ---- | ---------- |
4169| itemType   | [CipherSpecItem](#cipherspecitem10) | 是   | 用于指定需要获取的加解密参数。 |
4170
4171**返回值:**
4172
4173| 类型           | 说明        |
4174| -------------- | ----------- |
4175| string \| Uint8Array | 获取的加解密参数的具体值。 |
4176
4177**错误码:**
4178以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4179
4180| 错误码ID | 错误信息               |
4181| -------- | ---------------------- |
4182| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4183| 801 | this operation is not supported.          |
4184| 17620001 | memory operation failed.          |
4185| 17630001 | crypto operation error. |
4186
4187**示例:**
4188
4189```ts
4190import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4191
4192function testGetCipherSpec() {
4193  let cipher = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1");
4194  let mdName = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR);
4195  console.info('getCipherSpec: mdName =' + mdName);
4196}
4197```
4198
4199## cryptoFramework.createSign
4200
4201createSign(algName: string): Sign
4202
4203生成Sign实例。
4204
4205支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。
4206
4207**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4208
4209**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4210
4211API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4212
4213**参数:**
4214
4215| 参数名  | 类型   | 必填 | 说明                                                         |
4216| ------- | ------ | ---- | ------------------------------------------------------------ |
4217| algName | string | 是   | 指定签名算法:RSA、ECC、DSA、SM2<sup>10+</sup>或Ed25519<sup>11+</sup>。使用RSA PKCS1模式时需设置摘要;使用RSA PSS模式时需设置摘要和掩码摘要。签名时,通过设置OnlySign参数可传入数据摘要仅作签名。 |
4218
4219**返回值**:
4220
4221| 类型 | 说明                               |
4222| ---- | ---------------------------------- |
4223| [Sign](#sign) | 返回由输入算法指定生成的Sign对象。 |
4224
4225**错误码:**
4226以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
4227
4228| 错误码ID | 错误信息               |
4229| -------- | ---------------------- |
4230| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4231| 801 | this operation is not supported.          |
4232| 17620001 | memory operation failed.          |
4233
4234**示例:**
4235
4236```ts
4237import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4238
4239let signer1 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256');
4240
4241let signer2 = cryptoFramework.createSign('RSA1024|PSS|SHA256|MGF1_SHA256');
4242
4243let signer3 = cryptoFramework.createSign('ECC224|SHA256');
4244
4245let signer4 = cryptoFramework.createSign('DSA2048|SHA256');
4246
4247let signer5 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256|OnlySign');
4248```
4249
4250## Sign
4251
4252Sign类,使用Sign方法之前需要创建该类的实例进行操作,通过[createSign(algName: string): Sign](#cryptoframeworkcreatesign)方法构造此实例。按序调用本类中的init、update、sign方法完成签名操作。签名操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4253
4254Sign类不支持重复初始化,当业务方需要使用新密钥签名时,需要重新创建新Sign对象并调用init初始化。
4255
4256业务方使用时,调用createSign接口确定签名的模式,调用init接口设置密钥。
4257
4258当待签名数据长度较短时,可在初始化后直接调用sign接口传入数据进行签名,无需调用update。
4259
4260当待签名数据较长时,可通过update接口分段传入切分后的原文数据,最后调用sign接口对整体原文数据进行签名。
4261
4262当使用update分段传入原文时,sign接口API 10之前只支持传入DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用sign进行签名。
4263
4264使用DSA算法签名时,如果摘要算法设置为NoHash,则不支持update操作,调用update接口将返回错误码ERR_CRYPTO_OPERATION。
4265
4266### 属性
4267
4268**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4269
4270**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4271
4272API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4273
4274| 名称    | 类型   | 只读 | 可选 | 说明                         |
4275| ------- | ------ | ---- | ---- | ---------------------------- |
4276| algName | string | 是   | 否   | 签名指定的算法名称。 |
4277
4278### init
4279
4280init(priKey: PriKey, callback: AsyncCallback\<void>): void
4281
4282使用私钥初始化Sign对象,通过注册回调函数获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。
4283
4284Sign类不支持重复初始化。
4285
4286**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4287
4288**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4289
4290API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4291
4292**参数:**
4293
4294| 参数名   | 类型                 | 必填 | 说明             |
4295| -------- | -------------------- | ---- | ---------------- |
4296| priKey   | [PriKey](#prikey)    | 是   | 用于Sign的初始化。 |
4297| callback | AsyncCallback\<void> | 是   | 回调函数。当签名初始化成功,err为undefined,否则为错误对象。 |
4298
4299**错误码:**
4300以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4301
4302| 错误码ID | 错误信息               |
4303| -------- | ---------------------- |
4304| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4305| 17620001 | memory operation failed.          |
4306| 17620002 | failed to convert parameters between arkts and c.         |
4307| 17630001 | crypto operation error. |
4308
4309### init
4310
4311init(priKey: PriKey): Promise\<void>
4312
4313使用私钥初始化Sign对象,通过Promise获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。
4314
4315Sign类不支持重复初始化。
4316
4317**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4318
4319**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4320
4321API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4322
4323**参数:**
4324
4325| 参数名 | 类型 | 必填 | 说明             |
4326| ------ | ---- | ---- | ---------------- |
4327| priKey | [PriKey](#prikey)  | 是   | 用于Sign的初始化。 |
4328
4329**返回值:**
4330
4331| 类型           | 说明          |
4332| -------------- | ------------- |
4333| Promise\<void> | 无返回结果的Promise对象。 |
4334
4335**错误码:**
4336以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4337
4338| 错误码ID | 错误信息               |
4339| -------- | ---------------------- |
4340| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4341| 17620001 | memory operation failed.          |
4342| 17620002 | failed to convert parameters between arkts and c.         |
4343| 17630001 | crypto operation error. |
4344
4345### initSync<sup>12+</sup>
4346
4347initSync(priKey: PriKey): void
4348
4349使用私钥初始化Sign对象,通过同步方式获取结果。initSync、updateSync、signSync为三段式接口,需要成组使用。其中initSync和signSync必选,updateSync可选。
4350
4351Sign类不支持重复调用initSync。
4352
4353**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4354
4355**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4356
4357**参数:**
4358
4359| 参数名 | 类型 | 必填 | 说明             |
4360| ------ | ---- | ---- | ---------------- |
4361| priKey | [PriKey](#prikey)  | 是   | 用于Sign的初始化。 |
4362
4363**错误码:**
4364以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4365
4366| 错误码ID | 错误信息               |
4367| -------- | ---------------------- |
4368| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4369| 17620001 | memory operation failed.          |
4370| 17620002 | failed to convert parameters between arkts and c.         |
4371| 17630001 | crypto operation error. |
4372
4373### update
4374
4375update(data: DataBlob, callback: AsyncCallback\<void>): void
4376
4377追加待签名数据,通过注册回调函数完成更新。
4378
4379必须在对[Sign](#sign)实例使用[init()](#init-2)初始化后,才能使用本函数。
4380
4381> **说明:**
4382>
4383> 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[sign](#sign-1))或多次调用update。<br/>
4384> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
4385> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
4386> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/>
4387> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
4388
4389**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4390
4391**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4392
4393API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4394
4395**参数:**
4396
4397| 参数名   | 类型                  | 必填 | 说明         |
4398| -------- | --------------------- | ---- | ------------ |
4399| data     | [DataBlob](#datablob) | 是   | 传入的消息。 |
4400| callback | AsyncCallback\<void>  | 是   | 回调函数。当签名更新成功,err为undefined,否则为错误对象。|
4401
4402**错误码:**
4403以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
4404
4405| 错误码ID | 错误信息               |
4406| -------- | ---------------------- |
4407| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4408| 17620001 | memory operation failed.          |
4409| 17620002 | failed to convert parameters between arkts and c.          |
4410| 17630001 | crypto operation error. |
4411
4412### update
4413
4414update(data: DataBlob): Promise\<void>
4415
4416追加待签名数据,通过Promise方式完成更新。
4417
4418在使用本函数前,必须先使用[Sign](#sign)方法对[init()](#init-3)实例进行初始化。
4419
4420> **说明:**
4421>
4422> 根据数据量,可以不调用update(即[init](#init-3)完成后直接调用[sign](#sign-2))或多次调用update。<br/>
4423> 算法库不对单次或累计的update数据量设置大小限制。建议在处理大数据量的签名操作时,采用多次update方式传入数据,以避免一次性申请过多内存。
4424> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
4425> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/>
4426> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
4427
4428**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4429
4430**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4431
4432API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4433
4434**参数:**
4435
4436| 参数名 | 类型     | 必填 | 说明       |
4437| ------ | -------- | ---- | ---------- |
4438| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |
4439
4440**返回值:**
4441
4442| 类型           | 说明          |
4443| -------------- | ------------- |
4444| Promise\<void> | 无返回结果的Promise对象。 |
4445
4446**错误码:**
4447以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。
4448
4449| 错误码ID | 错误信息               |
4450| -------- | ---------------------- |
4451| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4452| 17620001 | memory operation failed.          |
4453| 17620002 | failed to convert parameters between arkts and c.         |
4454| 17630001 | crypto operation error. |
4455
4456### updateSync<sup>12+</sup>
4457
4458updateSync(data: DataBlob): void
4459
4460追加待签名数据,通过同步方式完成更新。
4461
4462必须在对[Sign](#sign)实例使用[initSync()](#initsync12-1)初始化后,才能使用本函数。
4463
4464> **说明:**
4465>
4466> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-1)完成后直接调用[signSync](#signsync12))或多次调用updateSync。<br/>
4467> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/>
4468> 签名使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
4469> OnlySign模式下,不支持updateSync操作,需要直接使用signSync传入数据。<br/>
4470> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。
4471
4472**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4473
4474**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4475
4476**参数:**
4477
4478| 参数名 | 类型     | 必填 | 说明       |
4479| ------ | -------- | ---- | ---------- |
4480| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |
4481
4482**返回值:**
4483
4484| 类型           | 说明          |
4485| -------------- | ------------- |
4486| void | 无返回结果。 |
4487
4488**错误码:**
4489以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。
4490
4491| 错误码ID | 错误信息               |
4492| -------- | ---------------------- |
4493| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4494| 17620001 | memory operation failed.          |
4495| 17620002 | failed to convert parameters between arkts and c.         |
4496| 17630001 | crypto operation error. |
4497
4498### sign
4499
4500sign(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void
4501
4502对数据进行签名,通过注册回调函数获取签名结果。
4503
4504**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4505
4506**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4507
4508API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4509
4510**参数:**
4511
4512| 参数名   | 类型                 | 必填 | 说明       |
4513| -------- | -------------------- | ---- | ---------- |
4514| data     | [DataBlob](#datablob) \| null<sup>10+</sup>              | 是   | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 |
4515| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取DataBlob数据。 |
4516
4517**错误码:**
4518以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
4519
4520| 错误码ID | 错误信息               |
4521| -------- | ---------------------- |
4522| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4523| 17620001 | memory operation failed.          |
4524| 17620002 | failed to convert parameters between arkts and c.         |
4525| 17630001 | crypto operation error. |
4526
4527### sign
4528
4529sign(data: DataBlob | null): Promise\<DataBlob>
4530
4531对数据进行签名,通过Promise方式返回签名结果。
4532
4533**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4534
4535**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4536
4537API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4538
4539**参数:**
4540
4541| 参数名 | 类型     | 必填 | 说明       |
4542| ------ | -------- | ---- | ---------- |
4543| data   | [DataBlob](#datablob) \| null<sup>10+</sup>  | 是   | 传入的消息。 |
4544
4545**返回值:**
4546
4547| 类型           | 说明          |
4548| -------------- | ------------- |
4549| Promise\<[DataBlob](#datablob)> | 返回签名结果。 |
4550
4551**错误码:**
4552以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4553
4554| 错误码ID | 错误信息               |
4555| -------- | ---------------------- |
4556| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4557| 17620001 | memory operation failed.          |
4558| 17620002 | failed to convert parameters between arkts and c.         |
4559| 17630001 | crypto operation error. |
4560
4561### signSync<sup>12+</sup>
4562
4563signSync(data: DataBlob | null): DataBlob
4564
4565对数据进行签名,通过同步方式返回签名结果。
4566
4567**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4568
4569**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4570
4571**参数:**
4572
4573| 参数名 | 类型     | 必填 | 说明       |
4574| ------ | -------- | ---- | ---------- |
4575| data   | [DataBlob](#datablob) \| null  | 是   | 传入的消息。 |
4576
4577**返回值:**
4578
4579| 类型           | 说明          |
4580| -------------- | ------------- |
4581| [DataBlob](#datablob) | 返回签名结果。 |
4582
4583**错误码:**
4584以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4585
4586| 错误码ID | 错误信息               |
4587| -------- | ---------------------- |
4588| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4589| 17620001 | memory operation failed.          |
4590| 17620002 | failed to convert parameters between arkts and c.         |
4591| 17630001 | crypto operation error. |
4592
4593**callback示例:**
4594
4595此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4596
4597```ts
4598import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4599import { buffer } from '@kit.ArkTS';
4600
4601function signByCallback() {
4602  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
4603  let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
4604  let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]);
4605  let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]);
4606  let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData };
4607  let priKeyBlob: cryptoFramework.DataBlob = { data: skData };
4608  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
4609  let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256');
4610  rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => {
4611    signer.init(keyPair.priKey, err => {
4612      signer.update(inputUpdate, err => {
4613        signer.sign(inputVerify, (err, signData) => {
4614          console.info('sign output is ' + signData.data);
4615        });
4616      });
4617    });
4618  });
4619}
4620```
4621
4622**Promise示例:**
4623
4624此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4625
4626```ts
4627import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4628import { buffer } from '@kit.ArkTS';
4629
4630async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
4631  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
4632  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
4633  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
4634  let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob);
4635  console.info('convertKey success');
4636  return keyPair;
4637}
4638
4639async function signByPromise() {
4640  let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]);
4641  let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]);
4642  let keyPair = await genKeyPairByData(pkData, skData);
4643  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
4644  let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
4645  let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256');
4646  await signer.init(keyPair.priKey);
4647  await signer.update(inputUpdate);
4648  let signData = await signer.sign(inputSign);
4649  console.info('signData result: ' + signData.data);
4650}
4651```
4652
4653**Sync示例:**
4654
4655此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4656
4657```ts
4658import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4659import { buffer } from '@kit.ArkTS';
4660
4661function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
4662  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
4663  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
4664  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
4665  let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob);
4666  console.info('convertKeySync success');
4667  return keyPair;
4668}
4669
4670function signBySync() {
4671  let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]);
4672  let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]);
4673  let keyPair =  genKeyPairByData(pkData, skData);
4674  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
4675  let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
4676  let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256');
4677  signer.initSync(keyPair.priKey);
4678  signer.updateSync(inputUpdate);
4679  let signData = signer.signSync(inputSign);
4680  console.info('signData result: ' + signData.data);
4681}
4682```
4683
4684### setSignSpec<sup>10+</sup>
4685
4686setSignSpec(itemType: SignSpecItem, itemValue: number): void
4687
4688setSignSpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void
4689
4690设置签名参数。常用签名参数可通过 [createSign](#cryptoframeworkcreatesign) 指定,其他参数则通过本接口设置。
4691
4692
4693只支持RSA算法、SM2算法,从API version11开始,支持SM2算法设置签名参数。
4694
4695**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4696
4697**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4698
4699API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4700
4701**参数:**
4702
4703| 参数名   | 类型                 | 必填 | 说明       |
4704| -------- | -------------------- | ---- | ---------- |
4705| itemType     | [SignSpecItem](#signspecitem10)              | 是   | 用于指定需要设置的签名参数。 |
4706| itemValue | number \| Uint8Array<sup>11+</sup> | 是   | 用于指定签名参数的具体值。 |
4707
4708**错误码:**
4709以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4710
4711| 错误码ID | 错误信息               |
4712| -------- | ---------------------- |
4713| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4714| 801 | this operation is not supported.          |
4715| 17620001 | memory operation failed.          |
4716| 17630001 | crypto operation error. |
4717
4718**示例:**
4719
4720```ts
4721import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4722
4723function testSetSignSpec() {
4724  let signer = cryptoFramework.createSign("RSA|PSS|SHA256|MGF1_SHA256");
4725  let setN = 20;
4726  signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN);
4727}
4728```
4729
4730### getSignSpec<sup>10+</sup>
4731
4732getSignSpec(itemType: SignSpecItem): string | number
4733
4734获取签名参数。当前仅支持RSA算法。
4735
4736**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4737
4738**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4739
4740API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4741
4742**参数:**
4743
4744| 参数名 | 类型     | 必填 | 说明       |
4745| ------ | -------- | ---- | ---------- |
4746| itemType | [SignSpecItem](#signspecitem10)  | 是   | 用于指定需要获取的签名参数。 |
4747
4748**返回值:**
4749
4750| 类型           | 说明        |
4751| -------------- | ----------- |
4752| string \| number | 获取的签名参数的具体值。 |
4753
4754**错误码:**
4755以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4756
4757| 错误码ID | 错误信息               |
4758| -------- | ---------------------- |
4759| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4760| 801 | this operation is not supported.          |
4761| 17620001 | memory operation failed.          |
4762| 17630001 | crypto operation error. |
4763
4764**示例:**
4765
4766```ts
4767import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4768
4769function testGetSignSpec() {
4770  let signer = cryptoFramework.createSign("RSA|PSS|SHA256|MGF1_SHA256");
4771  let setN = 32;
4772  signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN);
4773  let saltLen = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM);
4774}
4775```
4776
4777## cryptoFramework.createVerify
4778
4779createVerify(algName: string): Verify
4780
4781生成Verify实例。
4782
4783支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。
4784
4785**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4786
4787**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4788
4789API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4790
4791**参数:**
4792
4793| 参数名  | 类型   | 必填 | 说明                                                         |
4794| ------- | ------ | ---- | ------------------------------------------------------------ |
4795| algName | string | 是   | 指定签名算法:RSA、ECC、DSA、SM2<sup>10+</sup>或Ed25519<sup>11+</sup>。使用RSA PKCS1模式时需设置摘要;使用RSA PSS模式时需设置摘要和掩码摘要。使用RSA算法验签时,设置Recover参数可支持验签恢复。 |
4796
4797**返回值**:
4798
4799| 类型   | 说明                                 |
4800| ------ | ------------------------------------ |
4801| Verify | 返回由输入算法指定生成的Verify对象。 |
4802
4803**错误码:**
4804以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
4805
4806| 错误码ID | 错误信息               |
4807| -------- | ---------------------- |
4808| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4809| 801 | this operation is not supported.          |
4810| 17620001 | memory operation failed.          |
4811
4812**示例:**
4813
4814```ts
4815import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4816
4817let verifier1 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256');
4818
4819let verifier2 = cryptoFramework.createVerify('RSA1024|PSS|SHA256|MGF1_SHA256');
4820
4821let verifier3 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover');
4822```
4823
4824## Verify
4825
4826Verify类,使用Verify方法之前需要创建该类的实例进行操作,通过[createVerify(algName: string): Verify](#cryptoframeworkcreateverify)方法构造此实例。按序调用本类中的init、update、verify方法完成签名操作。验签操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4827
4828Verify类不支持重复初始化,当业务方需要使用新密钥验签时,需要重新创建新Verify对象并调用init初始化。
4829
4830业务方使用时,在createVerify时确定验签的模式,调用init接口设置密钥。
4831
4832当被签名的消息较短时,可在init初始化后,(无需update)直接调用verify接口传入被签名的消息和签名(signatureData)进行验签。
4833
4834当被签名的消息较长时,可通过update接口分段传入被签名的消息,最后调用verify接口对消息全文进行验签。verify接口的data入参在API 10之前只支持DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用verify传入签名(signatureData)进行验签。
4835
4836当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
4837
4838### 属性
4839
4840**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4841
4842**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4843
4844API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4845
4846| 名称    | 类型   | 只读 | 可选 | 说明                         |
4847| ------- | ------ | ---- | ---- | ---------------------------- |
4848| algName | string | 是   | 否   | 验签指定的算法名称。 |
4849
4850### init
4851
4852init(pubKey: PubKey, callback: AsyncCallback\<void>): void
4853
4854传入公钥初始化Verify对象,通过注册回调函数获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。
4855
4856**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4857
4858**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4859
4860API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4861
4862**参数:**
4863
4864| 参数名   | 类型                 | 必填 | 说明                           |
4865| -------- | -------------------- | ---- | ------------------------------ |
4866| pubKey   | [PubKey](#pubkey)    | 是   | 公钥对象,用于Verify的初始化。 |
4867| callback | AsyncCallback\<void> | 是   | 回调函数。当验签初始化成功,err为undefined,否则为错误对象。  |
4868
4869**错误码:**
4870以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4871
4872| 错误码ID | 错误信息               |
4873| -------- | ---------------------- |
4874| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4875| 17620001 | memory operation failed.          |
4876| 17620002 | failed to convert parameters between arkts and c.         |
4877| 17630001 | crypto operation error. |
4878
4879### init
4880
4881init(pubKey: PubKey): Promise\<void>
4882
4883传入公钥初始化Verify对象,通过Promise获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。
4884
4885**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4886
4887**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4888
4889API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4890
4891**参数:**
4892
4893| 参数名 | 类型 | 必填 | 说明                         |
4894| ------ | ---- | ---- | ---------------------------- |
4895| pubKey | [PubKey](#pubkey)  | 是   | 公钥对象,用于Verify的初始化。 |
4896
4897**返回值:**
4898
4899| 类型           | 说明          |
4900| -------------- | ------------- |
4901| Promise\<void> | 无返回结果的Promise对象。 |
4902
4903**错误码:**
4904以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
4905
4906| 错误码ID | 错误信息               |
4907| -------- | ---------------------- |
4908| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4909| 17620001 | memory operation failed.          |
4910| 17620002 | failed to convert parameters between arkts and c.         |
4911| 17630001 | crypto operation error. |
4912
4913### initSync<sup>12+</sup>
4914
4915initSync(pubKey: PubKey): void
4916
4917传入公钥初始化Verify对象,通过同步方式获取结果。initSync、updateSync、verifySync为三段式接口,需要成组使用。其中initSync和verifySync必选,updateSync可选。
4918
4919**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4920
4921**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4922
4923**参数:**
4924
4925| 参数名 | 类型 | 必填 | 说明                         |
4926| ------ | ---- | ---- | ---------------------------- |
4927| pubKey | [PubKey](#pubkey)  | 是   | 公钥对象,用于Verify的初始化。 |
4928
4929**返回值:**
4930
4931| 类型           | 说明          |
4932| -------------- | ------------- |
4933| void | 无返回结果。 |
4934
4935**错误码:**
4936以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
4937
4938| 错误码ID | 错误信息               |
4939| -------- | ---------------------- |
4940| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4941| 17620001 | memory operation failed.          |
4942| 17620002 | failed to convert parameters between arkts and c.         |
4943| 17630001 | crypto operation error. |
4944
4945### update
4946
4947update(data: DataBlob, callback: AsyncCallback\<void>): void
4948
4949追加待验签数据,通过注册回调函数完成更新。
4950
4951必须在对[Verify](#verify)实例使用[init](#init-4)初始化后,才能使用本函数。
4952
4953> **说明:**
4954>
4955> 根据数据量,可以不调用update(即[init](#init-4)完成后直接调用[verify](#verify-1))或多次调用update。<br/>
4956> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
4957> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
4958> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
4959
4960**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4961
4962**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4963
4964API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature4965
4966**参数:**
4967
4968| 参数名   | 类型                  | 必填 | 说明         |
4969| -------- | --------------------- | ---- | ------------ |
4970| data     | [DataBlob](#datablob) | 是   | 传入的消息。 |
4971| callback | AsyncCallback\<void>  | 是   | 回调函数。当验签更新成功,err为undefined,否则为错误对象。|
4972
4973**错误码:**
4974以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4975
4976| 错误码ID | 错误信息               |
4977| -------- | ---------------------- |
4978| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4979| 17620001 | memory operation failed.          |
4980| 17620002 | failed to convert parameters between arkts and c.         |
4981| 17630001 | crypto operation error. |
4982
4983### update
4984
4985update(data: DataBlob): Promise\<void>
4986
4987追加待验签数据,通过Promise方式完成更新。
4988
4989必须在对[Verify](#verify)实例使用[init()](#init-5)初始化后,才能使用本函数。
4990
4991> **说明:**
4992>
4993> 根据数据量,可以不调用update(即[init](#init-5)完成后直接调用[verify](#verify-2))或多次调用update。<br/>
4994> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
4995> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
4996> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
4997
4998**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4999
5000**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5001
5002API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature5003
5004**参数:**
5005
5006| 参数名 | 类型     | 必填 | 说明       |
5007| ------ | -------- | ---- | ---------- |
5008| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |
5009
5010**返回值:**
5011
5012| 类型           | 说明          |
5013| -------------- | ------------- |
5014| Promise\<void> | 无返回结果的Promise对象。 |
5015
5016**错误码:**
5017以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5018
5019| 错误码ID | 错误信息               |
5020| -------- | ---------------------- |
5021| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5022| 17620001 | memory operation failed.          |
5023| 17620002 | failed to convert parameters between arkts and c.         |
5024| 17630001 | crypto operation error. |
5025
5026### updateSync<sup>12+</sup>
5027
5028updateSync(data: DataBlob): void
5029
5030追加待验签数据,通过同步方式完成更新。
5031
5032必须在对[Verify](#verify)实例使用[initSync()](#initsync12-2)初始化后,才能使用本函数。
5033
5034> **说明:**
5035>
5036> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-2)完成后直接调用[verifySync](#verifysync12))或多次调用updateSync。<br/>
5037> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/>
5038> 验签使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
5039> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。
5040
5041**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5042
5043**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5044
5045**参数:**
5046
5047| 参数名 | 类型     | 必填 | 说明       |
5048| ------ | -------- | ---- | ---------- |
5049| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |
5050
5051**返回值:**
5052
5053| 类型           | 说明          |
5054| -------------- | ------------- |
5055| void | 无返回结果。 |
5056
5057**错误码:**
5058以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
5059
5060| 错误码ID | 错误信息               |
5061| -------- | ---------------------- |
5062| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5063| 17620001 | memory operation failed.          |
5064| 17620002 | failed to convert parameters between arkts and c.         |
5065| 17630001 | crypto operation error. |
5066
5067### verify
5068
5069verify(data: DataBlob | null, signatureData: DataBlob, callback: AsyncCallback\<boolean>): void
5070
5071对数据进行验签,通过注册回调函数返回验签结果。
5072
5073**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5074
5075**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5076
5077API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature5078
5079**参数:**
5080
5081| 参数名        | 类型                 | 必填 | 说明       |
5082| ------------- | -------------------- | ---- | ---------- |
5083| data          | [DataBlob](#datablob) \| null<sup>10+</sup>             | 是   | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 |
5084| signatureData | [DataBlob](#datablob)              | 是   | 签名数据。  |
5085| callback      | AsyncCallback\<boolean> | 是   | 回调函数,用于获取以boolean值表示的验签结果。 |
5086
5087**错误码:**
5088以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5089
5090| 错误码ID | 错误信息               |
5091| -------- | ---------------------- |
5092| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5093| 17620001 | memory operation failed.          |
5094| 17620002 | failed to convert parameters between arkts and c.         |
5095| 17630001 | crypto operation error. |
5096
5097### verify
5098
5099verify(data: DataBlob | null, signatureData: DataBlob): Promise\<boolean>
5100
5101对数据进行验签,通过Promise返回验签结果。
5102
5103**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5104
5105**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5106
5107API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature5108
5109**参数:**
5110
5111| 参数名        | 类型     | 必填 | 说明       |
5112| ------------- | -------- | ---- | ---------- |
5113| data          | [DataBlob](#datablob) \| null<sup>10+</sup>  | 是   | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 |
5114| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |
5115
5116**返回值:**
5117
5118| 类型              | 说明                           |
5119| ----------------- | ------------------------------ |
5120| Promise\<boolean> | 异步返回值,代表验签是否通过。 |
5121
5122**错误码:**
5123以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5124
5125| 错误码ID | 错误信息               |
5126| -------- | ---------------------- |
5127| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5128| 17620001 | memory operation failed.          |
5129| 17620002 | failed to convert parameters between arkts and c.         |
5130| 17630001 | crypto operation error. |
5131
5132### verifySync<sup>12+</sup>
5133
5134verifySync(data: DataBlob | null, signatureData: DataBlob): boolean
5135
5136对数据进行验签,通过同步方式返回验签结果。
5137
5138**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5139
5140**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5141
5142**参数:**
5143
5144| 参数名        | 类型     | 必填 | 说明       |
5145| ------------- | -------- | ---- | ---------- |
5146| data          | [DataBlob](#datablob) \| null  | 是   | 传入的消息。 |
5147| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |
5148
5149**返回值:**
5150
5151| 类型              | 说明                           |
5152| ----------------- | ------------------------------ |
5153| boolean | 同步返回值,表示验签是否成功。 |
5154
5155**错误码:**
5156以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5157
5158| 错误码ID | 错误信息               |
5159| -------- | ---------------------- |
5160| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5161| 17620001 | memory operation failed.          |
5162| 17620002 | failed to convert parameters between arkts and c.         |
5163| 17630001 | crypto operation error. |
5164
5165**callback示例:**
5166
5167此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
5168
5169```ts
5170import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5171import { buffer } from '@kit.ArkTS';
5172
5173function verifyByCallback() {
5174  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
5175  let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
5176  // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过。
5177  let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]);
5178  let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]);
5179  let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData };
5180  let priKeyBlob: cryptoFramework.DataBlob = { data: skData };
5181  // 该数据取自Sign中的signData.data5182  let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) }
5183  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
5184  let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256');
5185  rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => {
5186    verifier.init(keyPair.pubKey, err => {
5187      verifier.update(inputUpdate, err => {
5188        verifier.verify(inputVerify, signMessageBlob, (err, res) => {
5189          console.info('verify result is ' + res);
5190        });
5191      });
5192    });
5193  });
5194}
5195```
5196
5197**Promise示例:**
5198
5199更多示例请参见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
5200
5201```ts
5202import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5203import { buffer } from '@kit.ArkTS';
5204
5205async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
5206  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
5207  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
5208  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
5209  let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob);
5210  console.info('convertKey success');
5211  return keyPair;
5212}
5213
5214async function verifyByPromise() {
5215  // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过。
5216  let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]);
5217  let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]);
5218  let keyPair = await genKeyPairByData(pkData, skData);
5219  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
5220  let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
5221  // 该数据取自Sign中的signData.data5222  let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) };
5223  let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256');
5224  await verifier.init(keyPair.pubKey);
5225  await verifier.update(inputUpdate);
5226  let res = await verifier.verify(inputVerify, signMessageBlob);
5227  console.info('verify result: ' + res);
5228}
5229```
5230
5231**Sync示例:**
5232
5233此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
5234
5235```ts
5236import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5237import { buffer } from '@kit.ArkTS';
5238
5239function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
5240  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
5241  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
5242  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
5243  let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob);
5244  console.info('convertKey success');
5245  return keyPair;
5246}
5247
5248function verifyBySync() {
5249  // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过。
5250  let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]);
5251  let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]);
5252  let keyPair = genKeyPairByData(pkData, skData);
5253  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
5254  let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
5255  // 该数据取自Sign中的signData.data5256  let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) };
5257  let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256');
5258  verifier.initSync(keyPair.pubKey);
5259  verifier.updateSync(inputUpdate);
5260  let res = verifier.verifySync(inputVerify, signMessageBlob);
5261  console.info('verify result: ' + res);
5262}
5263```
5264
5265### recover<sup>12+</sup>
5266
5267recover(signatureData: DataBlob): Promise\<DataBlob | null>
5268
5269对数据进行签名恢复原始数据,通过Promise返回恢复结果。
5270
5271> **说明:**
5272>
5273> - 目前仅RSA支持。
5274
5275**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5276
5277**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5278
5279**参数:**
5280
5281| 参数名        | 类型     | 必填 | 说明       |
5282| ------------- | -------- | ---- | ---------- |
5283| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |
5284
5285**返回值:**
5286
5287| 类型              | 说明                           |
5288| ----------------- | ------------------------------ |
5289| Promise\<[DataBlob](#datablob)  \| null> | 验签恢复的数据。 |
5290
5291**错误码:**
5292以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
5293
5294| 错误码ID | 错误信息               |
5295| -------- | ---------------------- |
5296| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5297| 17620001 | memory operation failed.          |
5298| 17620002 | failed to convert parameters between arkts and c.         |
5299| 17630001 | crypto operation error. |
5300
5301**示例:**
5302
5303```ts
5304import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5305import { buffer } from '@kit.ArkTS';
5306import { BusinessError } from '@kit.BasicServicesKit';
5307
5308async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
5309  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
5310  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
5311  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
5312  let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob);
5313  console.info('convertKey success');
5314  return keyPair;
5315}
5316
5317async function recoverByPromise() {
5318  // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过。
5319  let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]);
5320  let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]);
5321  let keyPair = await genKeyPairByData(pkData, skData);
5322  // 该数据取自Sign中的signData.data5323  let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) };
5324  let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover');
5325  await verifier.init(keyPair.pubKey);
5326  try {
5327    let rawSignData = await verifier.recover(signMessageBlob);
5328    if (rawSignData != null) {
5329      console.info('[Promise]: recover result: ' + rawSignData.data);
5330    } else {
5331      console.error("[Promise]: get verify recover result fail!");
5332    }
5333  } catch (error) {
5334    let e: BusinessError = error as BusinessError;
5335    console.error(`promise error, ${e.code}, ${e.message}`);
5336  }
5337}
5338```
5339
5340### recoverSync<sup>12+</sup>
5341
5342recoverSync(signatureData: DataBlob): DataBlob | null
5343
5344对数据进行签名恢复原始数据。
5345
5346> **说明:**
5347>
5348> - 目前仅RSA支持。
5349
5350**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5351
5352**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5353
5354**参数:**
5355
5356| 参数名        | 类型     | 必填 | 说明       |
5357| ------------- | -------- | ---- | ---------- |
5358| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |
5359
5360**返回值:**
5361
5362| 类型              | 说明                           |
5363| ----------------- | ------------------------------ |
5364| [DataBlob](#datablob)  \| null | 验签恢复的数据。 |
5365
5366**错误码:**
5367以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5368
5369| 错误码ID | 错误信息               |
5370| -------- | ---------------------- |
5371| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5372| 17620001 | memory operation failed.          |
5373| 17620002 | failed to convert parameters between arkts and c.         |
5374| 17630001 | crypto operation error. |
5375
5376### setVerifySpec<sup>10+</sup>
5377
5378setVerifySpec(itemType: SignSpecItem, itemValue: number): void
5379
5380setVerifySpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void
5381
5382设置验签参数。常用的签名参数可以直接通过[createVerify](#cryptoframeworkcreateverify) 来指定,剩余参数可以通过本接口指定。
5383
5384支持RSA算法和SM2算法,从API version 11开始,支持SM2算法设置验签参数。
5385
5386验签的参数应当与签名的参数保持一致。
5387
5388**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5389
5390**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5391
5392API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature5393
5394**参数:**
5395
5396| 参数名   | 类型                 | 必填 | 说明       |
5397| -------- | -------------------- | ---- | ---------- |
5398| itemType     | [SignSpecItem](#signspecitem10)              | 是   | 用于指定需要设置的验签参数。 |
5399| itemValue | number \| Uint8Array<sup>11+</sup> | 是   | 用于指定验签参数的具体值。 |
5400
5401**错误码:**
5402以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5403
5404| 错误码ID | 错误信息               |
5405| -------- | ---------------------- |
5406| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5407| 801 | this operation is not supported.          |
5408| 17620001 | memory operation failed.          |
5409| 17630001 | crypto operation error. |
5410
5411**示例:**
5412
5413```ts
5414import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5415
5416function testSetVerifySpec() {
5417  let verifier = cryptoFramework.createVerify("RSA2048|PSS|SHA256|MGF1_SHA256");
5418  let setN = 20;
5419  verifier.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN);
5420}
5421```
5422
5423### getVerifySpec<sup>10+</sup>
5424
5425getVerifySpec(itemType: SignSpecItem): string | number
5426
5427获取验签参数。当前只支持RSA算法。
5428
5429验签的参数应当与签名的参数保持一致。
5430
5431**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5432
5433**系统能力:** SystemCapability.Security.CryptoFramework.Signature
5434
5435API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature5436
5437**参数:**
5438
5439| 参数名 | 类型     | 必填 | 说明       |
5440| ------ | -------- | ---- | ---------- |
5441| itemType   | [SignSpecItem](#signspecitem10)  | 是   | 用于指定需要获取的验签参数。 |
5442
5443**返回值:**
5444
5445| 类型           | 说明        |
5446| -------------- | ----------- |
5447| string \| number | 获取的验签参数的具体值。 |
5448
5449**错误码:**
5450以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5451
5452| 错误码ID | 错误信息               |
5453| -------- | ---------------------- |
5454| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5455| 801 | this operation is not supported.          |
5456| 17620001 | memory operation failed.          |
5457| 17630001 | crypto operation error. |
5458
5459**示例:**
5460
5461```ts
5462import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5463
5464function testGetVerifySpec() {
5465  let verifier = cryptoFramework.createVerify("RSA2048|PSS|SHA256|MGF1_SHA256");
5466  let setN = 20;
5467  verifier.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN);
5468  let saltLen = verifier.getVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM);
5469}
5470```
5471
5472## cryptoFramework.createKeyAgreement
5473
5474createKeyAgreement(algName: string): KeyAgreement
5475
5476生成KeyAgreement实例。
5477
5478支持的规格详见[密钥协商规格](../../security/CryptoArchitectureKit/crypto-key-agreement-overview.md)。
5479
5480**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5481
5482**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
5483
5484API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.KeyAgreement5485
5486**参数:**
5487
5488| 参数名  | 类型   | 必填 | 说明                                                         |
5489| ------- | ------ | ---- | ------------------------------------------------------------ |
5490| algName | string | 是   | 指定密钥协商算法:目前仅支持ECC,从API version 11开始,增加支持X25519和DH。 |
5491
5492**返回值**:
5493
5494| 类型         | 说明                                       |
5495| ------------ | ------------------------------------------ |
5496| KeyAgreement | 返回由输入算法指定生成的KeyAgreement对象。 |
5497
5498**错误码:**
5499以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5500
5501| 错误码ID | 错误信息               |
5502| -------- | ---------------------- |
5503| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5504| 801 | this operation is not supported.          |
5505| 17620001 | memory operation failed.          |
5506
5507**示例:**
5508
5509```ts
5510import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5511
5512let keyAgreement = cryptoFramework.createKeyAgreement('ECC256');
5513```
5514
5515## KeyAgreement
5516
5517KeyAgreement类,使用密钥协商方法之前需要创建该类的实例进行操作,通过[createKeyAgreement(algName: string): KeyAgreement](#cryptoframeworkcreatekeyagreement)方法构造此实例。
5518
5519### 属性
5520
5521**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5522
5523**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
5524
5525API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.KeyAgreement5526
5527| 名称    | 类型   | 只读 | 可选 | 说明                         |
5528| ------- | ------ | ---- | ---- | ---------------------------- |
5529| algName | string | 是   | 否   | 密钥协商指定的算法名称。 |
5530
5531### generateSecret
5532
5533generateSecret(priKey: PriKey, pubKey: PubKey, callback: AsyncCallback\<DataBlob>): void
5534
5535基于传入的私钥与公钥进行密钥协商,通过注册回调函数返回共享密钥。
5536
5537**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5538
5539**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
5540
5541API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.KeyAgreement5542
5543**参数:**
5544
5545| 参数名   | 类型                     | 必填 | 说明                   |
5546| -------- | ------------------------ | ---- | ---------------------- |
5547| priKey   | [PriKey](#prikey)        | 是   | 设置密钥协商的私钥输入。 |
5548| pubKey   | [PubKey](#pubkey)        | 是   | 设置密钥协商的公钥输入。 |
5549| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 异步接受共享密钥的回调。 |
5550
5551**错误码:**
5552以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5553
5554| 错误码ID | 错误信息               |
5555| -------- | ---------------------- |
5556| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5557| 17620001 | memory operation failed.          |
5558| 17620002 | failed to convert parameters between arkts and c.         |
5559| 17630001 | crypto operation error. |
5560
5561### generateSecret
5562
5563generateSecret(priKey: PriKey, pubKey: PubKey): Promise\<DataBlob>
5564
5565基于传入的私钥与公钥进行密钥协商,通过Promise返回共享密钥。
5566
5567**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5568
5569**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
5570
5571API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.KeyAgreement5572
5573**参数:**
5574
5575| 参数名 | 类型   | 必填 | 说明                   |
5576| ------ | ------ | ---- | ---------------------- |
5577| priKey | [PriKey](#prikey) | 是   | 设置密钥协商的私钥输入。 |
5578| pubKey | [PubKey](#pubkey) | 是   | 设置密钥协商的公钥输入。 |
5579
5580**返回值:**
5581
5582| 类型               | 说明     |
5583| ------------------ | -------- |
5584| Promise\<[DataBlob](#datablob)> | 共享密钥。 |
5585
5586**错误码:**
5587以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5588
5589| 错误码ID | 错误信息               |
5590| -------- | ---------------------- |
5591| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5592| 17620001 | memory operation failed.          |
5593| 17620002 | failed to convert parameters between arkts and c.          |
5594| 17630001 | crypto operation error. |
5595
5596### generateSecretSync<sup>12+</sup>
5597
5598generateSecretSync(priKey: PriKey, pubKey: PubKey): DataBlob
5599
5600基于传入的私钥与公钥进行密钥协商,通过同步返回共享密钥。
5601
5602**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5603
5604**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
5605
5606**参数:**
5607
5608| 参数名 | 类型   | 必填 | 说明                   |
5609| ------ | ------ | ---- | ---------------------- |
5610| priKey | [PriKey](#prikey) | 是   | 设置密钥协商的私钥输入。 |
5611| pubKey | [PubKey](#pubkey) | 是   | 设置密钥协商的公钥输入。 |
5612
5613**返回值:**
5614
5615| 类型               | 说明     |
5616| ------------------ | -------- |
5617|[DataBlob](#datablob) | 共享密钥。 |
5618
5619**错误码:**
5620以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
5621
5622| 错误码ID | 错误信息               |
5623| -------- | ---------------------- |
5624| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5625| 17620001 | memory operation failed.          |
5626| 17620002 | failed to convert parameters between arkts and c.         |
5627| 17630001 | crypto operation error. |
5628
5629**callback示例:**
5630
5631```ts
5632import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5633import { BusinessError } from '@kit.BasicServicesKit';
5634
5635async function testGenerateSecret() {
5636  let eccGen = cryptoFramework.createAsyKeyGenerator('ECC256');
5637  let globalKeyPair = await eccGen.generateKeyPair();
5638  let keyAgreement = cryptoFramework.createKeyAgreement('ECC256');
5639  keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey, (err, secret) => {
5640    if (err) {
5641      console.error("keyAgreement error.");
5642      return;
5643    }
5644    console.info('keyAgreement output is ' + secret.data);
5645  });
5646}
5647```
5648
5649**Promise示例:**
5650
5651```ts
5652import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5653import { BusinessError } from '@kit.BasicServicesKit';
5654
5655async function testGenerateSecret() {
5656  let eccGen = cryptoFramework.createAsyKeyGenerator('ECC256');
5657  let globalKeyPair = await eccGen.generateKeyPair();
5658  let keyAgreement = cryptoFramework.createKeyAgreement('ECC256');
5659  let keyAgreementPromise = keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey);
5660  keyAgreementPromise.then(secret => {
5661    console.info('keyAgreement output is ' + secret.data);
5662  }).catch((error: BusinessError) => {
5663    console.error("keyAgreement error.");
5664  });
5665}
5666```
5667
5668**Sync示例:**
5669
5670```ts
5671import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5672import { BusinessError } from '@kit.BasicServicesKit';
5673
5674async function testGenerateSecretSync() {
5675  let eccGen = cryptoFramework.createAsyKeyGenerator('ECC256');
5676  let globalKeyPair = await eccGen.generateKeyPair();
5677  let keyAgreement = cryptoFramework.createKeyAgreement('ECC256');
5678  let secret = keyAgreement.generateSecretSync(globalKeyPair.priKey, globalKeyPair.pubKey);
5679  console.info("[Sync]keyAgreement output is " + secret.data);
5680}
5681```
5682
5683## cryptoFramework.createMd
5684
5685createMd(algName: string): Md
5686
5687生成Md实例,用于进行消息摘要的计算与操作。
5688
5689支持的规格详见[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest-overview.md#支持的算法与规格)。
5690
5691**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5692
5693**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5694
5695API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest5696
5697**参数:**
5698
5699| 参数名  | 类型   | 必填 | 说明                                                         |
5700| ------- | ------ | ---- | ------------------------------------------------------------ |
5701| algName | string | 是   | 指定摘要算法,支持算法请参考[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest-overview.md#支持的算法与规格)。 |
5702
5703**返回值**:
5704
5705| 类型 | 说明                                    |
5706| ---- | --------------------------------------- |
5707| Md   | 返回由输入算法指定生成的[Md](#md)对象。 |
5708
5709**错误码:**
5710以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
5711
5712| 错误码ID | 错误信息           |
5713| -------- | ------------------ |
5714| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5715| 17620001 | memory operation failed.       |
5716
5717**示例:**
5718
5719```ts
5720import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5721import { BusinessError } from '@kit.BasicServicesKit';
5722
5723try {
5724  // Set algName based on the algorithm supported.
5725  let md = cryptoFramework.createMd('SHA256');
5726} catch (error) {
5727  let e: BusinessError = error as BusinessError;
5728  console.error(`sync error, ${e.code}, ${e.message}`);
5729}
5730```
5731
5732## Md
5733
5734Md类,调用Md方法可以进行MD(Message Digest)摘要计算。调用前,需要通过[createMd](#cryptoframeworkcreatemd)构造Md实例。
5735
5736### 属性
5737
5738**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5739
5740**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5741
5742API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest5743
5744| 名称    | 类型   | 只读 | 可选 | 说明                   |
5745| ------- | ------ | ---- | ---- | ---------------------- |
5746| algName | string | 是   | 否   | 代表指定的摘要算法名。 |
5747
5748### update
5749
5750update(input: DataBlob, callback: AsyncCallback\<void>): void
5751
5752传入消息进行Md更新摘要状态,通过注册回调函数更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。
5753
5754> **说明:**
5755>
5756> Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。
5757
5758**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5759
5760**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5761
5762API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest5763
5764**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。
5765
5766**参数:**
5767
5768| 参数名   | 类型                  | 必填 | 说明         |
5769| -------- | --------------------- | ---- | ------------ |
5770| input    | [DataBlob](#datablob) | 是   | 传入的消息。 |
5771| callback | AsyncCallback\<void>  | 是   | 回调函数。当摘要更新成功,err为undefined,否则为错误对象。  |
5772
5773**错误码:**
5774以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5775
5776| 错误码ID | 错误信息               |
5777| -------- | ---------------------- |
5778| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5779| 17620001| memory operation failed. |
5780| 17630001 | crypto operation error. |
5781
5782### update
5783
5784update(input: DataBlob): Promise\<void>
5785
5786传入消息进行Md更新摘要状态,通过Promise更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。
5787
5788> **说明:**
5789>
5790> Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。
5791
5792**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5793
5794**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5795
5796API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest5797
5798**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。
5799
5800**参数:**
5801
5802| 参数名 | 类型     | 必填 | 说明         |
5803| ------ | -------- | ---- | ------------ |
5804| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
5805
5806**返回值:**
5807
5808| 类型           | 说明          |
5809| -------------- | ------------- |
5810| Promise\<void> | 无返回结果的Promise对象。 |
5811
5812**错误码:**
5813以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
5814
5815| 错误码ID | 错误信息               |
5816| -------- | ---------------------- |
5817| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5818| 17620001| memory operation failed. |
5819| 17630001 | crypto operation error. |
5820
5821### updateSync<sup>12+</sup>
5822
5823updateSync(input: DataBlob): void
5824
5825传入消息进行Md更新摘要状态,通过同步方式更新。updateSync和digestSync为两段式接口,需要成组使用。其中digestSync必选,updateSync可选。
5826
5827> **说明:**
5828>
5829> Md算法多次调用updateSync更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。
5830
5831**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5832
5833**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5834
5835**参数:**
5836
5837| 参数名 | 类型     | 必填 | 说明         |
5838| ------ | -------- | ---- | ------------ |
5839| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
5840
5841**错误码:**
5842以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
5843
5844| 错误码ID | 错误信息               |
5845| -------- | ---------------------- |
5846| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.      |
5847| 17620001| memory operation failed. |
5848| 17630001 | crypto operation error. |
5849
5850### digest
5851
5852digest(callback: AsyncCallback\<DataBlob>): void
5853
5854通过注册回调函数返回Md的计算结果。
5855
5856**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5857
5858**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5859
5860API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest5861
5862**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。
5863
5864**参数:**
5865
5866| 参数名   | 类型                     | 必填 | 说明       |
5867| -------- | ------------------------ | ---- | ---------- |
5868| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取DataBlob数据。 |
5869
5870**错误码:**
5871以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
5872
5873
5874| 错误码ID | 错误信息               |
5875| -------- | ---------------------- |
5876| 17620001 | memory operation failed.           |
5877| 17630001 | crypto operation error. |
5878
5879**示例:**
5880
5881```ts
5882import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5883import { buffer } from '@kit.ArkTS';
5884
5885function mdByCallback() {
5886  let md = cryptoFramework.createMd('SHA256');
5887  md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }, (err) => {
5888    md.digest((err, digestOutput) => {
5889      console.info('[Callback]: MD result: ' + digestOutput.data);
5890      console.info('[Callback]: MD len: ' + md.getMdLength());
5891    });
5892  });
5893}
5894```
5895
5896### digest
5897
5898digest(): Promise\<DataBlob>
5899
5900通过Promise返回Md的计算结果。
5901
5902**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5903
5904**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5905
5906API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest5907
5908**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。
5909
5910**返回值:**
5911
5912| 类型               | 说明        |
5913| ------------------ | ----------- |
5914| Promise\<[DataBlob](#datablob)> | Promise对象。 |
5915
5916**错误码:**
5917以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5918
5919| 错误码ID | 错误信息               |
5920| -------- | ---------------------- |
5921| 17620001 | memory operation failed.           |
5922| 17630001 | crypto operation error. |
5923
5924**示例:**
5925
5926```ts
5927import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5928import { buffer } from '@kit.ArkTS';
5929
5930async function mdByPromise() {
5931  let md = cryptoFramework.createMd('SHA256');
5932  await md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) });
5933  let mdOutput = await md.digest();
5934  console.info('[Promise]: MD result: ' + mdOutput.data);
5935  console.info('[Promise]: MD len: ' + md.getMdLength());
5936}
5937```
5938
5939### digestSync<sup>12+</sup>
5940
5941digestSync(): DataBlob
5942
5943通过同步方式返回Md的计算结果。
5944
5945**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5946
5947**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5948
5949**返回值:**
5950
5951| 类型               | 说明        |
5952| ------------------ | ----------- |
5953| [DataBlob](#datablob) | 表示生成的Md计算结果。 |
5954
5955**错误码:**
5956以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5957
5958| 错误码ID | 错误信息               |
5959| -------- | ---------------------- |
5960| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
5961| 17620001 | memory operation failed. |
5962| 17620002 | failed to convert parameters between arkts and c. |
5963| 17630001 | crypto operation error. |
5964
5965**示例:**
5966
5967```ts
5968import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5969import { buffer } from '@kit.ArkTS';
5970
5971async function mdBySync() {
5972  let md = cryptoFramework.createMd('SHA256');
5973  md.updateSync({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) });
5974  let mdOutput = md.digestSync();
5975  console.info('[Sync]: MD result: ' + mdOutput.data);
5976  console.info('[Sync]: MD len: ' + md.getMdLength());
5977}
5978```
5979
5980### getMdLength
5981
5982getMdLength(): number
5983
5984获取Md消息摘要的字节长度。
5985
5986**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5987
5988**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5989
5990API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest5991
5992**返回值:**
5993
5994| 类型   | 说明                       |
5995| ------ | -------------------------- |
5996| number | 返回md计算结果的字节长度。 |
5997
5998**错误码:**
5999以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。
6000
6001| 错误码ID | 错误信息               |
6002| -------- | ---------------------- |
6003| 17630001 | crypto operation error. |
6004
6005**示例:**
6006
6007```ts
6008import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6009
6010function getLength() {
6011  let md = cryptoFramework.createMd('SHA256');
6012  console.info('[Promise]: MD len: ' + md.getMdLength());
6013}
6014```
6015
6016## cryptoFramework.createMac
6017
6018createMac(algName: string): Mac
6019
6020生成Mac实例,用于消息认证码的计算与操作。
6021
6022支持的规格详见[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac-overview.md)。
6023
6024**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6025
6026**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6027
6028API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac6029
6030**参数:**
6031
6032| 参数名  | 类型   | 必填 | 说明                                                         |
6033| ------- | ------ | ---- | ------------------------------------------------------------ |
6034| algName | string | 是   | 指定摘要算法,支持算法请参考[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac-overview.md)。 |
6035
6036**返回值**:
6037
6038| 类型 | 说明                                      |
6039| ---- | ----------------------------------------- |
6040| Mac  | 返回由输入算法指定生成的[Mac](#mac)对象。 |
6041
6042**错误码:**
6043以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6044
6045| 错误码ID | 错误信息           |
6046| -------- | ------------------ |
6047| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6048| 17620001 | memory operation failed.       |
6049
6050**示例:**
6051
6052```ts
6053import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6054import { BusinessError } from '@kit.BasicServicesKit';
6055
6056try {
6057  // Set algName based on the algorithm supported.
6058  let mac = cryptoFramework.createMac('SHA256');
6059} catch (error) {
6060  let e: BusinessError = error as BusinessError;
6061  console.error(`sync error, ${e.code}, ${e.message}`);
6062}
6063```
6064
6065## cryptoFramework.createMac<sup>18+</sup>
6066
6067createMac(macSpec: MacSpec): Mac
6068
6069生成Mac实例,用于进行消息认证码的计算与操作。
6070
6071支持的规格详见[MAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac-overview.md)。
6072
6073**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
6074
6075**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6076
6077**参数:**
6078
6079| 参数名  | 类型   | 必填 | 说明                                                         |
6080| ------- | ------ | ---- | ------------------------------------------------------------ |
6081| macSpec | [MacSpec](#macspec18) | 是   | 根据消息验证码的不同算法,指定入参结构体,支持算法请参考[MAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac-overview.md)。 |
6082
6083**返回值**:
6084
6085| 类型 | 说明                                      |
6086| ---- | ----------------------------------------- |
6087| Mac  | 返回由指定入参结构体生成的[Mac](#mac)对象。 |
6088
6089**错误码:**
6090以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6091
6092| 错误码ID | 错误信息           |
6093| -------- | ------------------ |
6094| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6095| 17620001 | memory operation failed.       |
6096| 17620002 | failed to convert parameters between arkts and c.      |
6097| 17630001 | crypto operation error.       |
6098
6099**示例:**
6100
6101```ts
6102import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6103import { BusinessError } from '@kit.BasicServicesKit';
6104
6105try {
6106  // Set algName based on the algorithm supported.
6107  let spec: cryptoFramework.HmacSpec = {
6108    algName: "HMAC",
6109    mdName: "SHA256",
6110  };
6111  let mac = cryptoFramework.createMac(spec);
6112} catch (error) {
6113  let e: BusinessError = error as BusinessError;
6114  console.error(`sync error, ${e.code}, ${e.message}`);
6115}
6116```
6117
6118## Mac
6119
6120Mac类,调用Mac方法可以进行MAC(Message Authentication Code)加密计算。调用前,需要通过[createMac](#cryptoframeworkcreatemac)构造Mac实例。
6121
6122### 属性
6123
6124**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6125
6126**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6127
6128API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac6129
6130| 名称    | 类型   | 只读 | 可选 | 说明                   |
6131| ------- | ------ | ---- | ---- | ---------------------- |
6132| algName | string | 是   | 否   | 代表指定的摘要算法名。 |
6133
6134### init
6135
6136init(key: SymKey, callback: AsyncCallback\<void>): void
6137
6138使用对称密钥初始化Mac计算,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。
6139
6140  > **说明:**
6141  >
6142  > 建议通过[HMAC密钥生成规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md#hmac)创建对称密钥生成器,调用[generateSymKey](#generatesymkey)随机生成对称密钥或调用[convertKey](#convertkey)传入与密钥规格长度一致的二进制密钥数据生成密钥。<br/>当指定“HMAC”生成对称密钥生成器时,仅支持调用[convertKey](#convertkey)传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据生成密钥。
6143
6144**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6145
6146**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6147
6148API version 9-11 系统能力为SystemCapability.Security.CryptoFramework;从API version 12 开始为SystemCapability.Security.CryptoFramework.Mac6149
6150**参数:**
6151
6152| 参数名   | 类型                 | 必填 | 说明           |
6153| -------- | -------------------- | ---- | -------------- |
6154| key      | [SymKey](#symkey)    | 是   | 对称密钥。 |
6155| callback | AsyncCallback\<void> | 是   | 回调函数。当HMAC初始化成功,err为undefined,否则为错误对象。  |
6156
6157**错误码:**
6158以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6159
6160| 错误码ID | 错误信息               |
6161| -------- | ---------------------- |
6162| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6163| 17620001| memory operation failed. |
6164| 17630001 | crypto operation error. |
6165
6166### init
6167
6168init(key: SymKey): Promise\<void>
6169
6170使用对称密钥初始化Mac计算,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。
6171
6172**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6173
6174**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6175
6176API version 9-11 系统能力为SystemCapability.Security.CryptoFramework;从API version 12 开始为SystemCapability.Security.CryptoFramework.Mac6177
6178**参数:**
6179
6180| 参数名 | 类型   | 必填 | 说明         |
6181| ------ | ------ | ---- | ------------ |
6182| key    | [SymKey](#symkey) | 是   | 对称密钥。 |
6183
6184**返回值:**
6185
6186| 类型           | 说明          |
6187| -------------- | ------------- |
6188| Promise\<void> | 无返回结果的Promise对象。 |
6189
6190**错误码:**
6191以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6192
6193| 错误码ID | 错误信息               |
6194| -------- | ---------------------- |
6195| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6196| 17620001| memory operation failed. |
6197| 17630001 | crypto operation error. |
6198
6199### initSync<sup>12+</sup>
6200
6201initSync(key: SymKey): void
6202
6203使用对称密钥初始化Mac计算,通过同步方式获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。
6204
6205**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6206
6207**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6208
6209**参数:**
6210
6211| 参数名 | 类型   | 必填 | 说明         |
6212| ------ | ------ | ---- | ------------ |
6213| key    | [SymKey](#symkey) | 是   | 对称密钥。 |
6214
6215**错误码:**
6216以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
6217
6218| 错误码ID | 错误信息               |
6219| -------- | ---------------------- |
6220| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.     |
6221| 17620001| memory operation failed. |
6222| 17630001 | crypto operation error. |
6223
6224### update
6225
6226update(input: DataBlob, callback: AsyncCallback\<void>): void
6227
6228传入消息进行Mac更新消息认证码状态,通过注册回调函数获取结果。
6229
6230> **说明:**
6231>
6232> HMAC算法多次调用update更新的代码示例详见[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。
6233
6234**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6235
6236**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6237
6238API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac6239
6240**参数:**
6241
6242| 参数名   | 类型                  | 必填 | 说明         |
6243| -------- | --------------------- | ---- | ------------ |
6244| input    | [DataBlob](#datablob) | 是   | 传入的消息。 |
6245| callback | AsyncCallback\<void>  | 是   | 回调函数。当HMAC更新成功,err为undefined,否则为错误对象。|
6246
6247**错误码:**
6248以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。
6249
6250| 错误码ID | 错误信息               |
6251| -------- | ---------------------- |
6252| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6253| 17620001| memory operation failed. |
6254| 17630001 | crypto operation error. |
6255
6256### update
6257
6258update(input: DataBlob): Promise\<void>
6259
6260传入消息进行Mac更新消息认证码状态,通过Promise获取结果。
6261
6262> **说明:**
6263>
6264> HMAC算法多次调用update更新的代码示例详见[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。
6265
6266**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6267
6268**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6269
6270API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac6271
6272**参数:**
6273
6274| 参数名 | 类型     | 必填 | 说明       |
6275| ------ | -------- | ---- | ---------- |
6276| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
6277
6278**返回值:**
6279
6280| 类型           | 说明          |
6281| -------------- | ------------- |
6282| Promise\<void> | 无返回结果的Promise对象。 |
6283
6284**错误码:**
6285以下错误码的详细介绍请参见[crypto framework 错误码](errorcode-crypto-framework.md)。
6286
6287| 错误码ID | 错误信息               |
6288| -------- | ---------------------- |
6289| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6290| 17620001| memory operation failed. |
6291| 17630001 | crypto operation error. |
6292
6293### updateSync<sup>12+</sup>
6294
6295updateSync(input: DataBlob): void
6296
6297传入消息进行Mac更新消息认证码状态,通过同步方式获取结果。
6298
6299> **说明:**
6300>
6301> HMAC算法多次调用updateSync更新的代码示例详见[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。
6302
6303**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6304
6305**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6306
6307**参数:**
6308
6309| 参数名 | 类型     | 必填 | 说明       |
6310| ------ | -------- | ---- | ---------- |
6311| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
6312
6313
6314**错误码:**
6315以下错误码的详细介绍请参见[crypto framework 错误码](errorcode-crypto-framework.md)。
6316
6317| 错误码ID | 错误信息               |
6318| -------- | ---------------------- |
6319| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.      |
6320| 17620001| memory operation failed. |
6321| 17630001 | crypto operation error. |
6322
6323### doFinal
6324
6325doFinal(callback: AsyncCallback\<DataBlob>): void
6326
6327通过注册回调函数返回Mac的计算结果。
6328
6329**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6330
6331**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6332
6333API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac6334
6335**参数:**
6336
6337| 参数名   | 类型                     | 必填 | 说明     |
6338| -------- | ------------------------ | ---- | -------- |
6339| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取DataBlob数据。 |
6340
6341**错误码:**
6342以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6343
6344| 错误码ID | 错误信息               |
6345| -------- | ---------------------- |
6346| 17620001 | memory operation failed.           |
6347| 17630001 | crypto operation error. |
6348
6349**示例:**
6350
6351此外,更多HMAC的完整示例可参考开发指导中[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。
6352
6353```ts
6354import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6355import { buffer } from '@kit.ArkTS';
6356
6357function hmacByCallback() {
6358  let mac = cryptoFramework.createMac('SHA256');
6359  let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) };
6360  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
6361  symKeyGenerator.convertKey(keyBlob, (err, symKey) => {
6362    mac.init(symKey, (err) => {
6363      mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }, (err) => {
6364        mac.doFinal((err, output) => {
6365          console.info('[Callback]: HMAC result: ' + output.data);
6366          console.info('[Callback]: MAC len: ' + mac.getMacLength());
6367        });
6368      });
6369    });
6370  });
6371}
6372```
6373
6374### doFinal
6375
6376doFinal(): Promise\<DataBlob>
6377
6378通过Promise返回Mac的计算结果。
6379
6380**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6381
6382**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6383
6384API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac6385
6386**返回值:**
6387
6388| 类型               | 说明        |
6389| ------------------ | ----------- |
6390| Promise\<[DataBlob](#datablob)> | Promise对象。 |
6391
6392**错误码:**
6393以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6394
6395| 错误码ID | 错误信息               |
6396| -------- | ---------------------- |
6397| 17620001 | memory operation failed.           |
6398| 17630001 | crypto operation error. |
6399
6400**示例:**
6401
6402此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。
6403
6404```ts
6405import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6406import { buffer } from '@kit.ArkTS';
6407
6408async function hmacByPromise() {
6409  let mac = cryptoFramework.createMac('SHA256');
6410  let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) };
6411  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
6412  let symKey = await symKeyGenerator.convertKey(keyBlob);
6413  await mac.init(symKey);
6414  await mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) });
6415  let macOutput = await mac.doFinal();
6416  console.info('[Promise]: HMAC result: ' + macOutput.data);
6417  console.info('[Promise]: MAC len: ' + mac.getMacLength());
6418}
6419```
6420
6421### doFinalSync<sup>12+</sup>
6422
6423doFinalSync(): DataBlob
6424
6425通过同步方式返回Mac的计算结果。
6426
6427**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6428
6429**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6430
6431**返回值:**
6432
6433| 类型               | 说明        |
6434| ------------------ | ----------- |
6435| [DataBlob](#datablob) | 返回Mac的计算结果。 |
6436
6437**错误码:**
6438以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6439
6440| 错误码ID | 错误信息               |
6441| -------- | ---------------------- |
6442| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.          |
6443| 17620001 | memory operation failed.           |
6444| 17620002 | failed to convert parameters between arkts and c. |
6445| 17630001 | crypto operation error. |
6446
6447**示例:**
6448
6449此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。
6450
6451```ts
6452import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6453import { buffer } from '@kit.ArkTS';
6454
6455function hmacBySync() {
6456  let mac = cryptoFramework.createMac('SHA256');
6457  let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) };
6458  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
6459  let symKey = symKeyGenerator.convertKeySync(keyBlob);
6460  mac.initSync(symKey);
6461  mac.updateSync({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) });
6462  let macOutput = mac.doFinalSync();
6463  console.info('[Sync]: HMAC result: ' + macOutput.data);
6464  console.info('[Sync]: MAC len: ' + mac.getMacLength());
6465}
6466```
6467
6468### getMacLength
6469
6470getMacLength(): number
6471
6472获取Mac消息认证码的长度(字节数)。
6473
6474**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6475
6476**系统能力:** SystemCapability.Security.CryptoFramework.Mac
6477
6478API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac6479
6480**返回值:**
6481
6482| 类型   | 说明                        |
6483| ------ | --------------------------- |
6484| number | 返回Mac计算结果的字节长度。 |
6485
6486**错误码:**
6487以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6488
6489| 错误码ID | 错误信息               |
6490| -------- | ---------------------- |
6491| 17630001 | crypto operation error. |
6492
6493**示例:**
6494
6495```ts
6496import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6497import { BusinessError } from '@kit.BasicServicesKit';
6498
6499function  testGetMacLength()
6500{
6501  let mac = cryptoFramework.createMac('SHA256');
6502  console.info('Mac algName is: ' + mac.algName);
6503  let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
6504  let keyBlob: cryptoFramework.DataBlob = { data: keyData };
6505  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
6506  let promiseConvertKey = symKeyGenerator.convertKey(keyBlob);
6507  promiseConvertKey.then(symKey => {
6508    let promiseMacInit = mac.init(symKey);
6509    return promiseMacInit;
6510  }).then(() => {
6511    let blob: cryptoFramework.DataBlob = { data : new Uint8Array([83])};
6512    let promiseMacUpdate = mac.update(blob);
6513    return promiseMacUpdate;
6514  }).then(() => {
6515    let promiseMacDoFinal = mac.doFinal();
6516    return promiseMacDoFinal;
6517  }).then(macOutput => {
6518    console.info('[Promise]: HMAC result: ' + macOutput.data);
6519    let macLen = mac.getMacLength();
6520    console.info('MAC len: ' + macLen);
6521  }).catch((error: BusinessError) => {
6522    console.error("[Promise]: error: " + error.message);
6523  });
6524}
6525```
6526
6527## cryptoFramework.createRandom
6528
6529createRandom(): Random
6530
6531生成Random实例,用于进行随机数的计算与设置种子。
6532
6533支持的规格详见框架概述[随机数算法规格](../../security/CryptoArchitectureKit/crypto-generate-random-number.md#支持的算法与规格)。
6534
6535**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
6536
6537**系统能力:** SystemCapability.Security.CryptoFramework.Rand
6538
6539API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand6540
6541**返回值**:
6542
6543| 类型   | 说明                                            |
6544| ------ | ----------------------------------------------- |
6545| [Random](#random) | 返回由输入算法指定生成的[Random](#random)对象。 |
6546
6547**错误码:**
6548以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6549
6550| 错误码ID | 错误信息     |
6551| -------- | ------------ |
6552| 17620001 | memory operation failed. |
6553
6554**示例:**
6555
6556```ts
6557import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6558import { BusinessError } from '@kit.BasicServicesKit';
6559
6560try {
6561  let rand = cryptoFramework.createRandom();
6562} catch (error) {
6563  let e: BusinessError = error as BusinessError;
6564  console.error(`sync error, ${e.code}, ${e.message}`);
6565}
6566```
6567
6568## Random
6569
6570Random类,调用Random方法可以进行随机数计算。调用前,需要通过[createRandom](#cryptoframeworkcreaterandom)构造Random实例。
6571
6572### 属性
6573
6574**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
6575
6576**系统能力:** SystemCapability.Security.CryptoFramework.Rand
6577
6578API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand6579
6580| 名称    | 类型   | 只读 | 可选 | 说明                 |
6581| ------- | ------ | ---- | ---- | -------------------- |
6582| algName<sup>10+</sup> | string | 是   | 否   | 代表当前使用的随机数生成算法,目前只支持“CTR_DRBG"。 |
6583
6584### generateRandom
6585
6586generateRandom(len: number, callback: AsyncCallback\<DataBlob>): void
6587
6588异步生成指定长度的随机数,通过注册回调函数返回。
6589
6590**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
6591
6592**系统能力:** SystemCapability.Security.CryptoFramework.Rand
6593
6594API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand6595
6596**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。
6597
6598**参数:**
6599
6600| 参数名   | 类型                     | 必填 | 说明                 |
6601| -------- | ------------------------ | ---- | -------------------- |
6602| len      | number                   | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
6603| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取DataBlob数据。 |
6604
6605**错误码:**
6606以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6607
6608| 错误码ID | 错误信息               |
6609| -------- | ---------------------- |
6610| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6611| 17620001 | memory operation failed.          |
6612| 17630001 | crypto operation error. |
6613
6614**示例:**
6615
6616```ts
6617import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6618
6619let rand = cryptoFramework.createRandom();
6620rand.generateRandom(12, (err, randData) => {
6621  if (err) {
6622    console.error("[Callback] err: " + err.code);
6623  } else {
6624    console.info('[Callback]: generate random result: ' + randData.data);
6625  }
6626});
6627```
6628
6629### generateRandom
6630
6631generateRandom(len: number): Promise\<DataBlob>
6632
6633异步生成指定长度的随机数,通过Promise返回。
6634
6635**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
6636
6637**系统能力:** SystemCapability.Security.CryptoFramework.Rand
6638
6639API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand6640
6641**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。
6642
6643**参数:**
6644
6645| 参数名 | 类型   | 必填 | 说明                                                   |
6646| ------ | ------ | ---- | ------------------------------------------------------ |
6647| len    | number | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
6648
6649**返回值:**
6650
6651| 类型               | 说明        |
6652| ------------------ | ----------- |
6653| Promise\<[DataBlob](#datablob)> | Promise对象。 |
6654
6655**错误码:**
6656以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6657
6658| 错误码ID | 错误信息               |
6659| -------- | ---------------------- |
6660| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6661| 17620001 | memory operation failed.           |
6662| 17630001 | crypto operation error. |
6663
6664**示例:**
6665
6666```ts
6667import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6668import { BusinessError } from '@kit.BasicServicesKit';
6669
6670let rand = cryptoFramework.createRandom();
6671let promiseGenerateRand = rand.generateRandom(12);
6672promiseGenerateRand.then(randData => {
6673  console.info('[Promise]: rand result: ' + randData.data);
6674}).catch((error: BusinessError) => {
6675  console.error("[Promise]: error: " + error.message);
6676});
6677```
6678
6679### generateRandomSync<sup>10+</sup>
6680
6681generateRandomSync(len: number): DataBlob
6682
6683同步生成指定长度的随机数。
6684
6685**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
6686
6687**系统能力:** SystemCapability.Security.CryptoFramework.Rand
6688
6689API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand6690
6691**参数:**
6692
6693| 参数名 | 类型   | 必填 | 说明                 |
6694| ------ | ------ | ---- | -------------------- |
6695| len    | number | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
6696
6697**返回值:**
6698
6699| 类型               | 说明        |
6700| ------------------ | ----------- |
6701|[DataBlob](#datablob) | 表示生成的随机数。 |
6702
6703**错误码:**
6704以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。
6705
6706| 错误码ID | 错误信息               |
6707| -------- | ---------------------- |
6708| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6709| 17620001 | memory operation failed.           |
6710| 17630001 | crypto operation error. |
6711
6712**示例:**
6713
6714```ts
6715import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6716import { BusinessError } from '@kit.BasicServicesKit';
6717
6718let rand = cryptoFramework.createRandom();
6719try {
6720  let randData = rand.generateRandomSync(12);
6721  if (randData != null) {
6722    console.info('[Sync]: rand result: ' + randData.data);
6723  } else {
6724    console.error("[Sync]: get rand result fail!");
6725  }
6726} catch (error) {
6727  let e: BusinessError = error as BusinessError;
6728  console.error(`sync error, ${e.code}, ${e.message}`);
6729}
6730```
6731
6732### setSeed
6733
6734setSeed(seed: DataBlob): void
6735
6736设置指定的种子。
6737
6738**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
6739
6740**系统能力:** SystemCapability.Security.CryptoFramework.Rand
6741
6742API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand6743
6744**参数:**
6745
6746| 参数名 | 类型     | 必填 | 说明         |
6747| ------ | -------- | ---- | ------------ |
6748| seed   | [DataBlob](#datablob) | 是   | 设置的种子。 |
6749
6750**错误码:**
6751以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。
6752
6753| 错误码ID | 错误信息           |
6754| -------- | ----------------- |
6755| 17620001 | memory operation failed.      |
6756
6757**示例:**
6758
6759```ts
6760import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6761import { BusinessError } from '@kit.BasicServicesKit';
6762
6763let rand = cryptoFramework.createRandom();
6764rand.generateRandom(12, (err, randData) => {
6765  if (err) {
6766    console.error("[Callback] err: " + err.code);
6767  } else {
6768    console.info('[Callback]: generate random result: ' + randData.data);
6769    try {
6770      rand.setSeed(randData);
6771    } catch (error) {
6772      let e: BusinessError = error as BusinessError;
6773      console.error(`sync error, ${e.code}, ${e.message}`);
6774    }
6775  }
6776});
6777```
6778
6779## cryptoFramework.createKdf<sup>11+</sup>
6780
6781createKdf(algName: string): Kdf
6782
6783密钥派生函数(key derivation function)实例生成。<br/>支持的规格详见[密钥派生函数规格](../../security/CryptoArchitectureKit/crypto-key-derivation-overview.md)。
6784
6785**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6786
6787**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6788
6789API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf6790
6791**参数:**
6792
6793| 参数名  | 类型   | 必填 | 说明                              |
6794| ------- | ------ | ---- | --------------------------------- |
6795| algName | string | 是   | 指定密钥派生算法(包含HMAC配套的散列函数):目前支持PBKDF2、HKDF算法、SCRYPT算法,如"PBKDF2\|SHA256", "HKDF\|SHA256", "SCRYPT"。 |
6796
6797**返回值**:
6798
6799| 类型         | 说明                                       |
6800| ------------ | ------------------------------------------ |
6801| [Kdf](#kdf11) | 返回由输入算法指定生成的Kdf对象。 |
6802
6803**错误码:**
6804以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6805
6806| 错误码ID | 错误信息               |
6807| -------- | ---------------------- |
6808| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6809| 801 | this operation is not supported.          |
6810| 17620001 | memory operation failed.          |
6811
6812**示例:**
6813- PBKDF2算法
6814```ts
6815import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6816
6817let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
6818```
6819
6820## Kdf<sup>11+</sup>
6821
6822密钥派生函数(key derivation function)类,使用密钥派生方法之前需要创建该类的实例进行操作,通过createKdf(algName: string): Kdf方法构造此实例。
6823
6824### 属性
6825
6826**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6827
6828**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6829
6830API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf6831
6832| 名称    | 类型   | 只读 | 可选 | 说明                         |
6833| ------- | ------ | ---- | ---- | ---------------------------- |
6834| algName | string | 是   | 否   | 密钥派生函数的算法名称。 |
6835
6836### generateSecret<sup>11+</sup>
6837
6838generateSecret(params: KdfSpec, callback: AsyncCallback\<DataBlob>): void
6839
6840基于传入的密钥派生参数进行密钥派生,通过注册回调函数返回派生得到的密钥。
6841
6842**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6843
6844**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6845
6846API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf6847
6848**参数:**
6849
6850| 参数名   | 类型                     | 必填 | 说明                   |
6851| -------- | ------------------------ | ---- | ---------------------- |
6852| params   | [KdfSpec](#kdfspec11)        | 是   | 设置密钥派生函数的参数。 |
6853| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取派生得到的密钥DataBlob数据。 |
6854
6855**错误码:**
6856以下错误码的详细介绍请参见[crypto framework错误码]。
6857
6858| 错误码ID | 错误信息               |
6859| -------- | ---------------------- |
6860| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6861| 17620001 | memory operation failed.          |
6862| 17630001 | crypto operation error. |
6863
6864**示例:**
6865
6866- PBKDF2算法
6867  ```ts
6868  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6869
6870  let spec: cryptoFramework.PBKDF2Spec = {
6871    algName: 'PBKDF2',
6872    password: '123456',
6873    salt: new Uint8Array(16),
6874    iterations: 10000,
6875    keySize: 32
6876  };
6877  let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
6878  kdf.generateSecret(spec, (err, secret) => {
6879    if (err) {
6880      console.error("key derivation error.");
6881      return;
6882    }
6883    console.info('key derivation output is ' + secret.data);
6884  });
6885  ```
6886
6887- HKDF算法
6888  ```ts
6889  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6890
6891  let spec: cryptoFramework.HKDFSpec = {
6892    algName: 'HKDF',
6893    key: '123456',
6894    salt: new Uint8Array(16),
6895    info: new Uint8Array(16),
6896    keySize: 32
6897  };
6898  let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND');
6899  kdf.generateSecret(spec, (err, secret) => {
6900    if (err) {
6901      console.error("key derivation error.");
6902      return;
6903    }
6904    console.info('key derivation output is ' + secret.data);
6905  });
6906  ```
6907
6908### generateSecret<sup>11+</sup>
6909
6910generateSecret(params: KdfSpec): Promise\<DataBlob>
6911
6912基于传入的密钥派生参数进行密钥派生,通过Promise形式返回派生得到的密钥。
6913
6914**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6915
6916**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6917
6918API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf6919
6920**参数:**
6921
6922| 参数名 | 类型   | 必填 | 说明                   |
6923| ------ | ------ | ---- | ---------------------- |
6924| params   | [KdfSpec](#kdfspec11)        | 是   | 设置密钥派生函数的参数。 |
6925
6926**返回值:**
6927
6928| 类型               | 说明     |
6929| ------------------ | -------- |
6930| Promise\<[DataBlob](#datablob)> | 通过Promise形式返回派生得到的密钥。 |
6931
6932**错误码:**
6933以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6934
6935| 错误码ID | 错误信息               |
6936| -------- | ---------------------- |
6937| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6938| 17620001 | memory operation failed.          |
6939| 17630001 | crypto operation error. |
6940
6941**示例:**
6942
6943- PBKDF2算法
6944  ```ts
6945  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6946  import { BusinessError } from '@kit.BasicServicesKit';
6947
6948  let spec: cryptoFramework.PBKDF2Spec = {
6949    algName: 'PBKDF2',
6950    password: '123456',
6951    salt: new Uint8Array(16),
6952    iterations: 10000,
6953    keySize: 32
6954  };
6955  let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
6956  let kdfPromise = kdf.generateSecret(spec);
6957  kdfPromise.then(secret => {
6958    console.info('key derivation output is ' + secret.data);
6959  }).catch((error: BusinessError) => {
6960    console.error("key derivation error, " + error.message);
6961  });
6962  ```
6963
6964- HKDF算法
6965  ```ts
6966  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6967  import { BusinessError } from '@kit.BasicServicesKit';
6968
6969  let spec: cryptoFramework.HKDFSpec = {
6970    algName: 'HKDF',
6971    key: '123456',
6972    salt: new Uint8Array(16),
6973    info: new Uint8Array(16),
6974    keySize: 32
6975  };
6976  let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND');
6977  let kdfPromise = kdf.generateSecret(spec);
6978  kdfPromise.then(secret => {
6979    console.info('key derivation output is ' + secret.data);
6980  }).catch((error: BusinessError) => {
6981    console.error("key derivation error, " + error.message);
6982  });
6983  ```
6984
6985### generateSecretSync<sup>12+</sup>
6986
6987generateSecretSync(params: KdfSpec): DataBlob
6988
6989基于传入的密钥派生参数进行密钥派生,通过同步方式返回派生得到的密钥。
6990
6991**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6992
6993**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6994
6995**参数:**
6996
6997| 参数名 | 类型   | 必填 | 说明                   |
6998| ------ | ------ | ---- | ---------------------- |
6999| params   | [KdfSpec](#kdfspec11)        | 是   | 设置密钥派生函数的参数。 |
7000
7001**返回值:**
7002
7003| 类型               | 说明     |
7004| ------------------ | -------- |
7005| [DataBlob](#datablob) | 用于获取派生得到的密钥DataBlob数据。 |
7006
7007**错误码:**
7008以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
7009
7010| 错误码ID | 错误信息               |
7011| -------- | ---------------------- |
7012| 401 | invalid parameters.  Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.  |
7013| 17620001 | memory operation failed.          |
7014| 17620002 | failed to convert parameters between arkts and c. |
7015| 17630001 | crypto operation error. |
7016
7017**示例:**
7018
7019- PBKDF2算法
7020  ```ts
7021  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
7022
7023  let spec: cryptoFramework.PBKDF2Spec = {
7024    algName: 'PBKDF2',
7025    password: '123456',
7026    salt: new Uint8Array(16),
7027    iterations: 10000,
7028    keySize: 32
7029  };
7030  let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
7031  let secret = kdf.generateSecretSync(spec);
7032  console.info("[Sync]key derivation output is " + secret.data);
7033  ```
7034
7035- HKDF算法
7036  ```ts
7037  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
7038
7039  let spec: cryptoFramework.HKDFSpec = {
7040    algName: 'HKDF',
7041    key: '123456',
7042    salt: new Uint8Array(16),
7043    info: new Uint8Array(16),
7044    keySize: 32
7045  };
7046  let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND');
7047  let secret = kdf.generateSecretSync(spec);
7048  console.info("[Sync]key derivation output is " + secret.data);
7049  ```
7050
7051## SignatureUtils<sup>20+</sup>
7052
7053用于SM2数据转换的工具类。
7054
7055### genEccSignatureSpec<sup>20+</sup>
7056
7057static genEccSignatureSpec(data: Uint8Array): EccSignatureSpec
7058
7059从ASN1 DER格式的sm2签名数据获取r和s。
7060
7061**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
7062
7063**系统能力:** SystemCapability.Security.CryptoFramework.Signature
7064
7065**参数:**
7066
7067| 参数名 | 类型   | 必填 | 说明                   |
7068| ------ | ------ | ---- | ---------------------- |
7069| data   | Uint8Array        | 是   | ASN1 DER格式的签名数据。 |
7070
7071**返回值:**
7072
7073| 类型               | 说明     |
7074| ------------------ | -------- |
7075| [EccSignatureSpec](#eccsignaturespec20) | 包含r和s的数据结构体。 |
7076
7077**错误码:**
7078以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
7079
7080| 错误码ID | 错误信息               |
7081| -------- | ---------------------- |
7082| 17620001 | memory operation failed.          |
7083| 17620002 | failed to convert parameters between arkts and c. |
7084| 17620003 | parameter check failed. Possible causes: <br>1. The length of the data parameter is 0 or too large. |
7085| 17630001 | crypto operation error. |
7086
7087**示例:**
7088
7089  ```ts
7090  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
7091  import { BusinessError } from '@kit.BasicServicesKit';
7092
7093  function testGenEccSignatureSpec() {
7094    try {
7095      let data =
7096        new Uint8Array([48, 69, 2, 33, 0, 216, 15, 76, 238, 158, 165, 108, 76, 72, 63, 115, 52, 255, 51, 149, 54, 224,
7097          179, 49, 225, 70, 36, 117, 88, 154, 154, 27, 194, 161, 3, 1, 115, 2, 32, 51, 9, 53, 55, 248, 82, 7, 159, 179,
7098          144, 57, 151, 195, 17, 31, 106, 123, 32, 139, 219, 6, 253, 62, 240, 181, 134, 214, 107, 27, 230, 175, 40])
7099      let spec: cryptoFramework.EccSignatureSpec = cryptoFramework.SignatureUtils.genEccSignatureSpec(data)
7100      console.info('genEccSignatureSpec success');
7101    } catch (err) {
7102      let e: BusinessError = err as BusinessError;
7103      console.error(`ecc error, ${e.code}, ${e.message}`);
7104    }
7105  }
7106  ```
7107
7108
7109### genEccSignature<sup>20+</sup>
7110
7111static genEccSignature(spec: EccSignatureSpec): Uint8Array;
7112
7113将(r、s)的sm2签名数据转换为ASN1 DER格式。
7114
7115**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
7116
7117**系统能力:** SystemCapability.Security.CryptoFramework.Signature
7118
7119**参数:**
7120
7121| 参数名 | 类型   | 必填 | 说明                   |
7122| ------ | ------ | ---- | ---------------------- |
7123| spec   | [EccSignatureSpec](#eccsignaturespec20)        | 是   | (r、s)的sm2签名数据。 |
7124
7125**返回值:**
7126
7127| 类型               | 说明     |
7128| ------------------ | -------- |
7129| Uint8Array | ASN1 DER格式的签名数据。 |
7130
7131**错误码:**
7132以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
7133
7134| 错误码ID | 错误信息               |
7135| -------- | ---------------------- |
7136| 17620001 | memory operation failed.          |
7137| 17620002 | failed to convert parameters between arkts and c. |
7138| 17620003 | parameter check failed. Possible causes: <br>1. The r or s value of the spec parameter is 0 or too large. |
7139| 17630001 | crypto operation error. |
7140
7141**示例:**
7142
7143  ```ts
7144  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
7145  import { BusinessError } from '@kit.BasicServicesKit';
7146
7147  function testGenEccSignature() {
7148    try {
7149      let spec: cryptoFramework.EccSignatureSpec = {
7150        r: BigInt('97726608965854271693043443511967021777934035174185659091642456228829830775155'),
7151        s: BigInt('23084224202834231287427338597254751764391338275617140205467537273296855150376'),
7152      }
7153
7154      let data = cryptoFramework.SignatureUtils.genEccSignature(spec)
7155      console.info('genEccSignature success');
7156      console.info('data is ' + data)
7157    } catch (err) {
7158      let e: BusinessError = err as BusinessError;
7159      console.error(`ecc error, ${e.code}, ${e.message}`);
7160    }
7161  }
7162  ```