1# @ohos.security.cryptoFramework (加解密算法库框架)
2
3为屏蔽底层硬件和算法库,向上提供统一的密码算法库加解密相关接口。
4
5> **说明:**
6>
7> - 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
8
9## 导入模块
10
11```ts
12import { cryptoFramework } from '@kit.CryptoArchitectureKit';
13```
14
15## Result
16
17 表示执行结果的枚举。
18
19 **系统能力:** SystemCapability.Security.CryptoFramework
20
21| 名称                                  |    值   |   说明                         |
22| ------------------------------------- | -------- | ---------------------------- |
23| INVALID_PARAMS                        | 401      | 非法入参。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                 |
24| NOT_SUPPORT                           | 801      | 操作不支持。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。                 |
25| ERR_OUT_OF_MEMORY                     | 17620001 | 内存错误。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                   |
26| ERR_RUNTIME_ERROR                     | 17620002 | 运行时外部错误。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。           |
27| ERR_CRYPTO_OPERATION                  | 17630001 | 调用三方算法库API出错。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。     |
28
29## DataBlob
30
31buffer数组,提供blob数据类型。
32
33 **原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
34
35 **系统能力:** SystemCapability.Security.CryptoFramework
36
37| 名称 | 类型       | 可读 | 可写 | 说明   |
38| ---- | ---------- | ---- | ---- | ------ |
39| data | Uint8Array | 是   | 是   | 数据。 |
40
41> **说明:**
42>
43> Uint8Array类型数据表示8位无符号整数的数组。
44
45## ParamsSpec
46
47加解密参数,在进行对称加解密时需要构造其子类对象,并将子类对象传入[init()](#init-2)方法。
48
49适用于需要iv等参数的对称加解密模式(对于无iv等参数的模式如ECB模式,无需构造,在[init()](#init-2)中传入null即可)。
50
51**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
52
53**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
54
55API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
56
57| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
58| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
59| algName | string | 是   | 是   | 指明对称加解密参数的算法模式。可选值如下:<br/> - "IvParamsSpec": 适用于CBC\|CTR\|OFB\|CFB模式<br/> - "GcmParamsSpec": 适用于GCM模式<br/> - "CcmParamsSpec": 适用于CCM模式 |
60
61> **说明:**
62>
63> 由于[init()](#init-2)的params参数是ParamsSpec类型(父类),而实际需要传入具体的子类对象(如IvParamsSpec),因此在构造子类对象时应设置其父类ParamsSpec的algName参数,使算法库在init()时知道传入的是哪种子类对象。
64
65## IvParamsSpec
66
67加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。
68
69适用于CBC、CTR、OFB、CFB这些仅使用iv作为参数的加解密模式。
70
71**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
72
73**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
74
75API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
76
77| 名称 | 类型                  | 可读 | 可写 | 说明                                                         |
78| ---- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
79| 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字节。 |
80
81> **说明:**
82>
83> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
84
85## GcmParamsSpec
86
87加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。
88
89适用于GCM模式。
90
91**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
92
93**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
94
95API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
96
97| 名称    | 类型                  | 可读 | 可写 | 说明                                                         |
98| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
99| iv      | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数iv,长度为1~16字节,常用为12字节。                             |
100| aad     | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数aad,长度为0~INT_MAX字节,常用为16字节。                             |
101| authTag | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数authTag,长度为16字节。<br/>采用GCM模式加密时,需要获取[doFinal()](#dofinal-2)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob),取出其末尾16字节作为解密时[init()](#init-2)或[initSync()](#initsync12)方法的入参GcmParamsSpec中的的authTag。 |
102
103> **说明:**
104>
105> 1. 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
106> 2. 对于在1~16字节长度范围内的iv,加解密算法库不作额外限制,但其结果取决于底层openssl是否支持。
107> 3. 用户不需要使用aad参数或aad长度为0时,可以指定aad的data属性为空的Uint8Array,来构造GcmParamsSpec,写法为aad: { data: new Uint8Array() }。
108
109## CcmParamsSpec
110
111加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。
112
113适用于CCM模式。
114
115**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
116
117**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
118
119API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
120
121| 名称    | 类型                  | 可读 | 可写 | 说明                                                         |
122| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
123| iv      | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数iv,长度为7字节。                              |
124| aad     | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数aad,长度为8字节。                             |
125| authTag | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数authTag,长度为12字节。<br/>采用CCM模式加密时,需要获取[doFinal()](#dofinal-2)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob),取出其末尾12字节作为解密时[init()](#init-2)或[initSync()](#initsync12)方法的入参[CcmParamsSpec](#ccmparamsspec)中的authTag。 |
126
127> **说明:**
128>
129> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
130
131## CryptoMode
132
133表示加解密操作的枚举。
134
135**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
136
137**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
138
139API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
140
141| 名称         | 值   | 说明               |
142| ------------ | ---- | ------------------ |
143| ENCRYPT_MODE | 0    | 表示进行加密操作。 |
144| DECRYPT_MODE | 1    | 表示进行解密操作。 |
145
146## AsyKeySpecItem<sup>10+</sup>
147
148表示密钥参数的枚举。
149
150**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
151
152**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
153
154API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
155
156| 名称         | 值   | 说明             |
157| ------------ | ---- | ---------------- |
158| DSA_P_BN | 101 | DSA算法的素模数p。 |
159| DSA_Q_BN | 102 | DSA算法中密钥参数q(p-1的素因子)。 |
160| DSA_G_BN | 103 | DSA算法的参数g。 |
161| DSA_SK_BN | 104 | DSA算法的私钥sk。 |
162| DSA_PK_BN | 105 | DSA算法的公钥pk。 |
163| ECC_FP_P_BN | 201 | ECC算法中表示椭圆曲线Fp域的素数p。 |
164| ECC_A_BN | 202 | ECC算法中椭圆曲线的第一个系数a。 |
165| ECC_B_BN | 203 | ECC算法中椭圆曲线的第二个系数b。 |
166| ECC_G_X_BN | 204 | ECC算法中基点g的x坐标。 |
167| ECC_G_Y_BN | 205 | ECC算法中基点g的y坐标。 |
168| ECC_N_BN | 206 | ECC算法中基点g的阶n。 |
169| ECC_H_NUM | 207 | ECC算法中的余因子h。 |
170| ECC_SK_BN | 208 | ECC算法中的私钥sk。 |
171| ECC_PK_X_BN | 209 | ECC算法中,公钥pk(椭圆曲线上的一个点)的x坐标。 |
172| ECC_PK_Y_BN | 210 | ECC算法中,公钥pk(椭圆曲线上的一个点)的y坐标。 |
173| ECC_FIELD_TYPE_STR | 211 | ECC算法中,椭圆曲线的域类型(当前只支持Fp域)。 |
174| ECC_FIELD_SIZE_NUM | 212 | ECC算法中域的大小,单位为bits(注:对于Fp域,域的大小为素数p的bits长度)。 |
175| ECC_CURVE_NAME_STR | 213 | ECC算法中的SECG(Standards for Efficient Cryptography Group)曲线名称。 |
176| RSA_N_BN | 301 | RSA算法中的模数n。 |
177| RSA_SK_BN | 302 | RSA算法中的私钥sk(即私钥指数d)。 |
178| RSA_PK_BN | 303 | RSA算法中的公钥pk(即公钥指数e)。 |
179| DH_P_BN<sup>11+</sup> | 401 | DH算法中的素数p。 |
180| DH_G_BN<sup>11+</sup> | 402 | DH算法中的参数g。 |
181| DH_L_NUM<sup>11+</sup> | 403 | DH算法中私钥长度,单位为bit。 |
182| DH_SK_BN<sup>11+</sup> | 404 | DH算法中的私钥sk。 |
183| DH_PK_BN<sup>11+</sup> | 405 | DH算法中的公钥pk。 |
184| ED25519_SK_BN<sup>11+</sup> | 501 | ED25519算法中的私钥sk。 |
185| ED25519_PK_BN<sup>11+</sup> | 502 | ED25519算法中的公钥pk。 |
186| X25519_SK_BN<sup>11+</sup> | 601 | X25519算法中的私钥sk。 |
187| X25519_PK_BN<sup>11+</sup> | 602 | X25519算法中的公钥pk。 |
188
189## AsyKeySpecType<sup>10+</sup>
190
191表示密钥参数类型的枚举。
192
193**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
194
195**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
196
197API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
198
199| 名称         | 值   | 说明             |
200| ------------ | ---- | ---------------- |
201| COMMON_PARAMS_SPEC | 0 | 表示公私钥中包含的公共参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair-2)随机生成密钥对。 |
202| PRIVATE_KEY_SPEC | 1 | 表示私钥中包含的参数。使用此类型的参数可以调用[generatePriKey](#generateprikey)生成指定的私钥。 |
203| PUBLIC_KEY_SPEC | 2 | 表示公钥中包含的参数。使用此类型的参数可以调用[generatePubKey](#generatepubkey)生成指定的公钥。 |
204| KEY_PAIR_SPEC | 3 | 表示公私钥中包含的全量参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair-2)生成指定的密钥对。 |
205
206## CipherSpecItem<sup>10+</sup>
207
208表示加解密参数的枚举,这些加解密参数支持通过[setCipherSpec](#setcipherspec10)接口设置/通过[getCipherSpec](#getcipherspec10)接口获取。
209
210当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_MD_NAME_STR参数的支持,详细规格请参考[加解密规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md)
211
212**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
213
214**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
215
216API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
217
218| 名称         | 值   | 说明             |
219| ------------ | ---- | ---------------- |
220| OAEP_MD_NAME_STR | 100 | 表示RSA算法中,使用PKCS1_OAEP模式时,消息摘要功能的算法名。 |
221| OAEP_MGF_NAME_STR | 101 | 表示RSA算法中,使用PKCS1_OAEP模式时,掩码生成算法(目前仅支持MGF1)。 |
222| OAEP_MGF1_MD_STR | 102 | 表示RSA算法中,使用PKCS1_OAEP模式时,MGF1掩码生成功能的消息摘要算法。 |
223| OAEP_MGF1_PSRC_UINT8ARR | 103 | 表示RSA算法中,使用PKCS1_OAEP模式时,pSource的字节流。 |
224| SM2_MD_NAME_STR<sup>11+</sup> | 104 | 表示SM2算法中,使用的摘要算法名。 |
225
226## SignSpecItem<sup>10+</sup>
227
228表示签名验签参数的枚举,这些签名验签参数支持通过[setSignSpec](#setsignspec10)、[setVerifySpec](#setverifyspec10)接口设置/通过[getSignSpec](#getsignspec10)、[getVerifySpec](#getverifyspec10)接口获取。
229
230当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_USER_ID_UINT8ARR参数的支持,详细规格请参考[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)
231
232**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
233
234**系统能力:** SystemCapability.Security.CryptoFramework.Signature
235
236API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
237
238| 名称         | 值   | 说明             |
239| ------------ | ---- | ---------------- |
240| PSS_MD_NAME_STR | 100 | 表示RSA算法中,使用PSS模式时,消息摘要功能的算法名。 |
241| PSS_MGF_NAME_STR | 101 | 表示RSA算法中,使用PSS模式时,掩码生成算法(目前仅支持MGF1)。 |
242| PSS_MGF1_MD_STR | 102 | 表示RSA算法中,使用PSS模式时,MGF1掩码生成功能的消息摘要参数。 |
243| PSS_SALT_LEN_NUM | 103 | 表示RSA算法中,使用PSS模式时,盐值的长度,长度以字节为单位。 |
244| PSS_TRAILER_FIELD_NUM | 104 | 表示RSA算法中,使用PSS模式时,用于编码操作的整数。 |
245| SM2_USER_ID_UINT8ARR<sup>11+</sup> | 105 | 表示SM2算法中,用户身份标识字段。 |
246
247## AsyKeySpec<sup>10+</sup>
248
249指定非对称密钥参数的基本接口,用于创建密钥生成器。在指定非对称密钥参数时需要构造其子类对象,并将子类对象传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。构造子类对象时,除了RSA密钥采用小端写法外,其他bigint类型的密钥参数均采用大端写法,并使用正数。
250
251**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
252
253**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
254
255API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
256
257| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
258| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
259| algName | string | 是   | 是   | 指定非对称密钥的算法名称,比如"RSA"、"DSA"、"ECC"、"SM2"、"Ed25519"、"X25519"、"DH"。 |
260| specType | [AsyKeySpecType](#asykeyspectype10) | 是   | 是 | 指定密钥参数类型,用于区分公/私钥参数。 |
261
262## DSACommonParamsSpec<sup>10+</sup>
263
264密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的公共参数,随机生成公/私钥。
265
266在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
267
268**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
269
270**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
271
272API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
273
274| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
275| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
276| p | bigint | 是   | 是   | 指定DSA算法的素模数p。 |
277| q | bigint | 是   | 是   | 指定DSA算法中密钥参数q(p-1的素因子)。 |
278| g | bigint | 是   | 是   | 指定DSA算法的参数g。 |
279
280## DSAPubKeySpec<sup>10+</sup>
281
282密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公钥包含的参数。
283
284在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
285
286**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
287
288**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
289
290API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
291
292| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
293| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
294| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 是   | 是   | 指定DSA算法中公私钥都包含的公共参数。 |
295| pk | bigint | 是   | 是   | 指定DSA算法的公钥。 |
296
297## DSAKeyPairSpec<sup>10+</sup>
298
299密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的全量参数。
300
301在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
302
303**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
304
305**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
306
307API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
308
309| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
310| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
311| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 是   | 是   | 指定DSA算法中公私钥都包含的公共参数。 |
312| sk | bigint | 是   | 是   | 指定DSA算法的私钥sk。 |
313| pk | bigint | 是   | 是   | 指定DSA算法的公钥pk。 |
314
315## ECField<sup>10+</sup>
316
317指定椭圆曲线的域。当前只支持Fp域。
318
319**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
320
321**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
322
323API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
324
325| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
326| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
327| fieldType | string | 是   | 是   | 指定椭圆曲线域的类型,当前只支持"Fp"。 |
328
329## ECFieldFp<sup>10+</sup>
330
331指定椭圆曲线素数域。是[ECField](#ecfield10)的子类。
332
333**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
334
335**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
336
337API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
338
339| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
340| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
341| p | bigint | 是   | 是   | 指定素数p。 |
342
343## Point<sup>10+</sup>
344
345指定椭圆曲线上的一个点。
346
347**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
348
349**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
350
351API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
352
353| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
354| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
355| x | bigint | 是   | 是   | 指定椭圆曲线上,点的x坐标。 |
356| y | bigint | 是   | 是   | 指定椭圆曲线上,点的y坐标。 |
357
358## ECCCommonParamsSpec<sup>10+</sup>
359
360密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的公共参数,随机生成公/私钥。
361
362在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
363
364**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
365
366**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
367
368API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
369
370| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
371| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
372| field | [ECField](#ecfield10) | 是   | 是   | 指定椭圆曲线的域(当前只支持Fp域)。 |
373| a | bigint | 是   | 是   | 指定椭圆曲线的第一个系数a。 |
374| b | bigint | 是   | 是   | 指定椭圆曲线的第二个系数b。 |
375| g | [Point](#point10) | 是   | 是   | 指定基点g。 |
376| n | bigint | 是   | 是   | 指定基点g的阶数n。 |
377| h | number | 是   | 是   | 指定余因子h。 |
378
379## ECCPriKeySpec<sup>10+</sup>
380
381密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中私钥包含的参数。
382
383在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
384
385**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
386
387**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
388
389API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
390
391| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
392| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
393| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是   | 是   | 指定ECC算法中公私钥都包含的公共参数。 |
394| sk | bigint | 是   | 是   | 指定ECC算法的私钥sk。 |
395
396## ECCPubKeySpec<sup>10+</sup>
397
398密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公钥包含的参数。
399
400在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
401
402**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
403
404**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
405
406API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
407
408| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
409| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
410| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是   | 是   | 指定ECC算法中公私钥都包含的公共参数。 |
411| pk | [Point](#point10) | 是   | 是   | 指定ECC算法的公钥pk。 |
412
413## ECCKeyPairSpec<sup>10+</sup>
414
415密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的全量参数。
416
417在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
418
419**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
420
421**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
422
423API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
424
425| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
426| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
427| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是   | 是   | 指定ECC算法中公私钥都包含的公共参数。 |
428| sk | bigint | 是   | 是   | 指定ECC算法的私钥sk。 |
429| pk | [Point](#point10) | 是   | 是   | 指定ECC算法的公钥pk。 |
430
431## RSACommonParamsSpec<sup>10+</sup>
432
433密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的公共参数,随机生成公/私钥。
434
435在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
436
437**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
438
439**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
440
441API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
442
443| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
444| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
445| n | bigint | 是   | 是   | 指定模数n。 |
446
447## RSAPubKeySpec<sup>10+</sup>
448
449密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公钥包含的参数。
450
451在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
452
453**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
454
455**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
456
457API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
458
459| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
460| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
461| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 是   | 是   | 指定RSA算法中公私钥都包含的公共参数。 |
462| pk | bigint | 是   | 是   | 指定RSA算法的公钥pk。 |
463
464## RSAKeyPairSpec<sup>10+</sup>
465
466密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的全量参数。
467
468在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
469
470**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
471
472**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
473
474API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
475
476| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
477| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
478| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 是   | 是   | 指定RSA算法中公私钥都包含的公共参数。 |
479| sk | bigint | 是   | 是   | 指定RSA算法的私钥sk。 |
480| pk | bigint | 是   | 是   | 指定RSA算法的公钥pk。 |
481
482## ED25519PriKeySpec<sup>11+</sup>
483
484密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中私钥包含的参数。
485
486在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
487
488**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
489
490**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
491
492API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
493
494| 名称 | 类型   | 可读 | 可写 | 说明                      |
495| ---- | ------ | ---- | ---- | ------------------------- |
496| sk   | bigint | 是   | 是   | 指定ED25519算法的私钥sk。 |
497
498## ED25519PubKeySpec<sup>11+</sup>
499
500密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中公钥包含的参数。
501
502在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
503
504**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
505
506**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
507
508API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
509
510| 名称 | 类型   | 可读 | 可写 | 说明                      |
511| ---- | ------ | ---- | ---- | ------------------------- |
512| pk   | bigint | 是   | 是   | 指定ED25519算法的公钥pk。 |
513
514## ED25519KeyPairSpec<sup>11+</sup>
515
516密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中公私钥包含的全量参数。
517
518在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
519
520**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
521
522**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
523
524API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
525
526| 名称 | 类型   | 可读 | 可写 | 说明                      |
527| ---- | ------ | ---- | ---- | ------------------------- |
528| sk   | bigint | 是   | 是   | 指定ED25519算法的私钥sk。 |
529| pk   | bigint | 是   | 是   | 指定ED25519算法的公钥pk。 |
530
531## X25519PriKeySpec<sup>11+</sup>
532
533密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中私钥包含的参数。
534
535在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
536
537**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
538
539**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
540
541API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
542
543| 名称 | 类型   | 可读 | 可写 | 说明                     |
544| ---- | ------ | ---- | ---- | ------------------------ |
545| sk   | bigint | 是   | 是   | 指定X25519算法的私钥sk。 |
546
547## X25519PubKeySpec<sup>11+</sup>
548
549密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公钥包含的参数。
550
551在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
552
553**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
554
555**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
556
557API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
558
559| 名称 | 类型   | 可读 | 可写 | 说明                     |
560| ---- | ------ | ---- | ---- | ------------------------ |
561| pk   | bigint | 是   | 是   | 指定X25519算法的公钥pk。 |
562
563## X25519KeyPairSpec<sup>11+</sup>
564
565密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公私钥包含的全量参数。
566
567在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
568
569**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
570
571**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
572
573API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
574
575| 名称 | 类型   | 可读 | 可写 | 说明                     |
576| ---- | ------ | ---- | ---- | ------------------------ |
577| sk   | bigint | 是   | 是   | 指定X25519算法的私钥sk。 |
578| pk   | bigint | 是   | 是   | 指定X25519算法的公钥pk。 |
579
580## DHCommonParamsSpec<sup>11+</sup>
581
582密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的参数。
583
584在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
585
586**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
587
588**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
589
590API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
591
592| 名称 | 类型   | 可读 | 可写 | 说明                                |
593| ---- | ------ | ---- | ---- | ----------------------------------- |
594| p    | bigint | 是   | 是   | 指定DH算法中大素数p。               |
595| g    | bigint | 是   | 是   | 指定DH算法中参数g。                 |
596| l    | number | 是   | 是   | 指定DH算法中私钥的长度,单位为bit。 |
597
598## DHPriKeySpec<sup>11+</sup>
599
600密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中私钥包含的参数。
601
602在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
603
604**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
605
606**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
607
608API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
609
610| 名称   | 类型               | 可读 | 可写 | 说明                                 |
611| ------ | ------------------ | ---- | ---- | ------------------------------------ |
612| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是   | 是   | 指定DH算法中公私钥都包含的公共参数。 |
613| sk     | bigint             | 是   | 是   | 指定DH算法的私钥sk。                 |
614
615## DHPubKeySpec<sup>11+</sup>
616
617密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公钥包含的参数。
618
619在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
620
621**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
622
623**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
624
625API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
626
627| 名称   | 类型               | 可读 | 可写 | 说明                                 |
628| ------ | ------------------ | ---- | ---- | ------------------------------------ |
629| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是   | 是   | 指定DH算法中公私钥都包含的公共参数。 |
630| pk     | bigint             | 是   | 是   | 指定DH算法的公钥pk。                 |
631
632## DHKeyPairSpec<sup>11+</sup>
633
634密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的全量参数。
635
636在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
637
638**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
639
640**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
641
642API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
643
644| 名称   | 类型               | 可读 | 可写 | 说明                                 |
645| ------ | ------------------ | ---- | ---- | ------------------------------------ |
646| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是   | 是   | 指定DH算法中公私钥都包含的公共参数。 |
647| sk     | bigint             | 是   | 是   | 指定DH算法的私钥sk。                 |
648| pk     | bigint             | 是   | 是   | 指定DH算法的公钥pk。                 |
649
650## KdfSpec<sup>11+</sup>
651
652密钥派生函数参数,使用密钥派生函数进行密钥派生时,需要构建其子类对象并作为输入。
653
654**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
655
656**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
657
658API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf
659
660| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
661| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
662| algName | string | 是   | 是   | 指明密钥派生函数的算法名,如"PBKDF2"。 |
663
664## PBKDF2Spec<sup>11+</sup>
665
666密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为PBKDF2密钥派生函数进行密钥派生时的输入。
667
668**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
669
670**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
671
672API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf
673
674| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
675| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
676| password | string \| Uint8Array | 是   | 是   | 用户输入的原始密码。|
677| salt | Uint8Array | 是   | 是   | 盐值。 |
678| iterations | number | 是   | 是   | 迭代次数,需要为正整数。 |
679| keySize | number | 是   | 是   | 派生得到的密钥字节长度。 |
680
681> **说明:**
682>
683> password指的是原始密码,如果使用string类型,需要直接传入用于密钥派生的数据,而不是HexString、base64等字符串类型,同时需要确保该字符串为utf-8编码,否则派生结果会有差异。
684
685## HKDFSpec<sup>12+</sup>
686
687密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为HKDF密钥派生函数进行密钥派生时的输入。
688
689**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
690
691**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
692
693| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
694| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
695| key | string \| Uint8Array | 是   | 是   | 密钥材料。|
696| salt | Uint8Array | 是   | 是   | 盐值。 |
697| info | Uint8Array | 是   | 是   | 拓展信息。 |
698| keySize | number | 是   | 是   | 派生得到的密钥字节长度。 |
699
700> **说明:**
701>
702> key指的是用户输入的最初的密钥材料。info与salt是可选参数,根据模式的不同可以传空,但是不可不传。
703>
704> 例如:EXTRACT_AND_EXPAND模式需要输入全部的值,EXTRACT_ONLY模式info可以为空,在构建HKDFspec的时候,info传入null值。
705>
706> 默认的模式为EXTRACT_AND_EXPAND,"HKDF|SHA256|EXTRACT_AND_EXPAND"等价于"HKDF|SHA256"。
707
708## SM2CipherTextSpec<sup>12+</sup>
709
710SM2密文参数,使用SM2密文格式转换函数进行格式转换时,需要用到此对象。可以通过指定此参数,生成符合国密标准的ASN.1格式的SM2密文,反之,也可以从ASN.1格式的SM2密文中获取具体参数。
711
712**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
713
714**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
715
716| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
717| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
718| xCoordinate | bigint | 是   | 是   | x分量|
719| yCoordinate | bigint | 是   | 是   | y分量 |
720| cipherTextData | Uint8Array | 是   | 是   | 密文|
721| hashData | Uint8Array | 是   | 是   | 杂凑值 |
722
723> **说明:**
724>
725> - hashData为使用SM3算法对明文数据运算得到的杂凑值,其长度固定为256位。
726>
727> - cipherTextData是与明文等长的密文。
728>
729> - 在拼接生成C1C3C2格式的密文时,如果x分量(C1_X)或y分量(C1_Y)的长度不足32字节,需要在高位补0,使得x分量和y分量的长度均为32字节。
730
731## Key
732
733密钥(父类),在运行密码算法(如加解密)时需要提前生成其子类对象,并传入[Cipher](#cipher)实例的[init()](#init-2)方法。
734
735密钥可以通过密钥生成器来生成。
736
737### 属性
738
739**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
740
741**系统能力:** SystemCapability.Security.CryptoFramework.Key
742
743API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key
744
745| 名称    | 类型   | 可读 | 可写 | 说明                         |
746| ------- | ------ | ---- | ---- | ---------------------------- |
747| format  | string | 是   | 否   | 密钥的格式。                 |
748| algName | string | 是   | 否   | 密钥对应的算法名(如果是对称密钥,则含密钥长度,否则不含密钥长度)。 |
749
750### getEncoded
751
752getEncoded(): DataBlob
753
754同步方法,获取密钥数据的字节流。密钥可以为对称密钥,公钥或者私钥。其中,公钥格式满足ASN.1语法、X.509规范、DER编码格式;私钥格式满足ASN.1语法,PKCS#8规范、DER编码方式。
755
756> **说明:**
757>
758> RSA算法使用密钥参数生成私钥时,私钥对象不支持getEncoded。
759
760**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
761
762**系统能力:** SystemCapability.Security.CryptoFramework.Key
763
764API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key
765
766**返回值:**
767
768| 类型                  | 说明                     |
769| --------------------- | ------------------------ |
770| [DataBlob](#datablob) | 用于查看密钥的具体内容。 |
771
772**错误码:**
773以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
774
775| 错误码ID | 错误信息               |
776| -------- | ---------------------- |
777| 801 | this operation is not supported. |
778| 17620001 | memory error. |
779| 17630001 | crypto operation error. |
780
781**示例:**
782
783```ts
784import { cryptoFramework } from '@kit.CryptoArchitectureKit';
785
786async function testGenerateAesKey() {
787  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
788  let symKey = await symKeyGenerator.generateSymKey();
789  let encodedKey = symKey.getEncoded();
790  console.info('key hex:' + encodedKey.data);
791}
792```
793
794## SymKey
795
796对称密钥,是[Key](#key)的子类,在对称加解密时需要将其对象传入[Cipher](#cipher)实例的[init()](#init-2)方法使用。
797
798对称密钥可以通过对称密钥生成器[SymKeyGenerator](#symkeygenerator)来生成。
799
800### clearMem
801
802clearMem(): void
803
804同步方法,将系统底层内存中的的密钥内容清零。建议在不再使用对称密钥实例时,调用本函数,避免内存中密钥数据存留过久。
805
806**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
807
808**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
809
810API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey
811
812**示例:**
813
814<!--code_no_check-->
815```ts
816let key: cryptoFramework.SymKey;    // The key is generated by a symKeyGenerator. The generation process is omitted here.
817let encodedKey = key.getEncoded();
818console.info('key blob: '+ encodedKey.data);    // Display key content.
819key.clearMem();
820encodedKey = key.getEncoded();
821console.info('key blob:' + encodedKey.data);    // Display all 0s.
822```
823
824## PubKey
825
826公钥,是[Key](#key)的子类,在非对称加解密、验签、密钥协商时需要将其对象作为输入使用。
827
828公钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
829
830### getAsyKeySpec<sup>10+</sup>
831
832getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number
833
834同步方法,获取密钥参数。
835
836**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
837
838**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
839
840API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
841
842**参数:**
843
844| 参数名 | 类型                  | 必填 | 说明                 |
845| ---- | --------------------- | ---- | -------------------- |
846| itemType  | [AsyKeySpecItem](#asykeyspecitem10) | 是   | 指定的密钥参数。 |
847
848**返回值:**
849
850| 类型                        | 说明                              |
851| --------------------------- | --------------------------------- |
852| bigint \| string \| number | 用于查看密钥参数的具体内容。 |
853
854**错误码:**
855以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
856
857| 错误码ID | 错误信息               |
858| -------- | ---------------------- |
859| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
860| 17620001 | memory error. |
861| 17630001 | crypto operation error. |
862
863**示例:**
864
865<!--code_no_check-->
866```ts
867let key: cryptoFramework.PubKey; // key is a public key object. The generation process is omitted here.
868let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN);
869console.info('ecc item --- p: ' + p.toString(16));
870```
871
872### getEncodedDer<sup>12+</sup>
873
874getEncodedDer(format: string): DataBlob
875
876支持根据指定的密钥格式(如采用哪个规范、是否压缩等),获取满足ASN.1语法、DER编码的公钥数据。当前仅支持获取ECC压缩/非压缩格式的公钥数据。
877
878> **说明:**
879>
880> 本接口和[Key.getEncoded()](#getencoded)的区别是:<br/>
881> 1. 本接口可根据入参决定数据的输出格式。
882> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式,生成的数据格式与原始数据格式保持一致。(原始数据格式,指通过[convertKey](#convertkey-3)接口生成密钥对象时的数据格式)。
883
884**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
885
886**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
887
888**参数:**
889
890| 参数名 | 类型                  | 必填 | 说明                 |
891| ---- | --------------------- | ---- | -------------------- |
892| format  | string | 是   | 用于指定当前密钥格式,取值仅支持"X509\|COMPRESSED"和"X509\|UNCOMPRESSED"。 |
893
894**返回值:**
895
896| 类型                        | 说明                              |
897| --------------------------- | --------------------------------- |
898| [DataBlob](#datablob) | 返回指定密钥格式的,满足ASN.1语法、DER编码的公钥数据。 |
899
900**错误码:**
901以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
902
903| 错误码ID | 错误信息               |
904| -------- | ---------------------- |
905| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
906| 17620001 | memory error. |
907| 17630001 | crypto operation error. |
908
909**示例:**
910
911<!--code_no_check-->
912```ts
913let key: cryptoFramework.PubKey; // Key is a public key object. The generation process is omitted here.
914let returnBlob = key.getEncodedDer('X509|UNCOMPRESSED');
915console.info('returnBlob data:' + returnBlob.data);
916```
917
918### getEncodedPem<sup>12+</sup>
919
920getEncodedPem(format: string): string
921
922同步方法,获取密钥数据的字符串。密钥可以为RSA公钥或者私钥。其中,公钥格式满足X.509规范、PKCS#1规范和PEM编码格式。
923
924**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
925
926**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
927
928**参数:**
929
930| 参数名 | 类型                  | 必填 | 说明                 |
931| ---- | --------------------- | ---- | -------------------- |
932| format  | string | 是   | 指定的获取密钥字符串的编码格式。其中,公钥可为'PKCS1' 或'X509'格式。|
933
934**返回值:**
935
936| 类型                        | 说明                              |
937| --------------------------- | --------------------------------- |
938| string | 用于获取指定密钥格式的具体内容。 |
939
940**错误码:**
941以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
942
943| 错误码ID | 错误信息               |
944| -------- | ---------------------- |
945| 401 | invalid parameters.  Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
946| 17620001 | memory error. |
947| 17630001 | crypto operation error. |
948
949**示例:**
950
951```ts
952import { cryptoFramework } from '@kit.CryptoArchitectureKit';
953
954let publicPkcs1Str1024: string  =
955  "-----BEGIN RSA PUBLIC KEY-----\n"
956  + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n"
957  + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n"
958  + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n"
959  + "-----END RSA PUBLIC KEY-----\n";
960
961function TestPubKeyPkcs1ToX509BySync1024() {
962  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
963  let keyPair = rsaGenerator.convertPemKeySync(publicPkcs1Str1024, null);
964  let pubPemKey = keyPair.pubKey;
965  let pubString = pubPemKey.getEncodedPem('X509');
966  console.info("[sync]TestPubKeyPkcs1ToX509BySync1024 pubString output is " + pubString);
967}
968```
969
970## PriKey
971
972私钥,是[Key](#key)的子类,在非对称加解密、签名、密钥协商时需要将其作为输入使用。
973
974私钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
975
976### clearMem
977
978clearMem(): void
979
980同步方法,将系统底层内存中的的密钥内容清零。
981
982**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
983
984**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
985
986API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
987
988**示例:**
989
990<!--code_no_check-->
991```ts
992let key: cryptoFramework.PriKey; // The key is a private key generated by the asymmetric key generator. The generation process is omitted here.
993key.clearMem(); // For the asymmetric private key, clearMem() releases the internal key struct. After clearMem is executed, getEncoded() is not supported.
994```
995
996### getAsyKeySpec<sup>10+</sup>
997
998getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number
999
1000同步方法,获取密钥参数。
1001
1002**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1003
1004**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1005
1006API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
1007
1008**参数:**
1009
1010| 参数名 | 类型                  | 必填 | 说明                 |
1011| ---- | --------------------- | ---- | -------------------- |
1012| itemType  | [AsyKeySpecItem](#asykeyspecitem10) | 是   | 指定的密钥参数类型。 |
1013
1014**返回值:**
1015
1016| 类型                        | 说明                              |
1017| --------------------------- | --------------------------------- |
1018| bigint \| string \| number | 用于查看密钥参数的具体内容。 |
1019
1020**错误码:**
1021以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1022
1023| 错误码ID | 错误信息               |
1024| -------- | ---------------------- |
1025| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1026| 17620001 | memory error. |
1027| 17630001 | crypto operation error. |
1028
1029**示例:**
1030
1031<!--code_no_check-->
1032```ts
1033let key: cryptoFramework.PriKey; // key is a private key object. The generation process is omitted here.
1034let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN);
1035console.info('ecc item --- p: ' + p.toString(16));
1036```
1037### getEncodedDer<sup>12+</sup>
1038
1039getEncodedDer(format: string): DataBlob
1040
1041支持根据指定的密钥格式(如采用哪个规范),获取满足ASN.1语法、DER编码的私钥数据。当前仅支持获取PKCS8格式的ecc私钥数据。
1042
1043> **说明:**
1044>
1045> 本接口和[Key.getEncoded()](#getencoded)的区别是:<br/>
1046> 1. 本接口可根据入参决定数据的输出格式,当前支持获取PKCS8格式的ecc私钥数据。
1047> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式。
1048
1049**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1050
1051**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1052
1053**参数:**
1054
1055| 参数名 | 类型                  | 必填 | 说明                 |
1056| ---- | --------------------- | ---- | -------------------- |
1057| format  | string | 是   | 用于指定当前密钥格式,取值当前仅支持"PKCS8"。 |
1058
1059**返回值:**
1060
1061| 类型                        | 说明                              |
1062| --------------------------- | --------------------------------- |
1063| [DataBlob](#datablob) | 返回指定密钥格式的,满足ASN.1语法、DER编码的ecc私钥数据。 |
1064
1065**错误码:**
1066以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1067
1068| 错误码ID | 错误信息               |
1069| -------- | ---------------------- |
1070| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1071| 17620001 | memory error. |
1072| 17630001 | crypto operation error. |
1073
1074**示例:**
1075
1076<!--code_no_check-->
1077```ts
1078let key: cryptoFramework.PriKey; // key is a private key object. The generation process is omitted here.
1079let returnBlob = key.getEncodedDer('PKCS8');
1080console.info('returnBlob data:' + returnBlob.data);
1081```
1082
1083### getEncodedPem<sup>12+</sup>
1084
1085getEncodedPem(format: string): string
1086
1087同步方法,获取密钥数据的字符串。密钥可以为RSA公钥或者私钥。其中,私钥格式满足PKCS#8规范、PKCS#1规范和PEM编码方式。
1088
1089**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1090
1091**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1092
1093**参数:**
1094
1095| 参数名 | 类型                  | 必填 | 说明                 |
1096| ---- | --------------------- | ---- | -------------------- |
1097| format  | string | 是   | 指定的获取密钥字符串的编码格式。其中,私钥可为'PKCS1' 或'PKCS8'格式。|
1098
1099**返回值:**
1100
1101| 类型                        | 说明                              |
1102| --------------------------- | --------------------------------- |
1103| string | 用于获取指定密钥格式的具体内容。 |
1104
1105**错误码:**
1106以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1107
1108| 错误码ID | 错误信息               |
1109| -------- | ---------------------- |
1110| 401 | invalid parameters.  Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1111| 17620001 | memory error. |
1112| 17630001 | crypto operation error. |
1113
1114**示例:**
1115
1116```ts
1117import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1118
1119let priKeyPkcs1Str1024: string  =
1120  "-----BEGIN RSA PRIVATE KEY-----\n"
1121  + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n"
1122  + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n"
1123  + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n"
1124  + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n"
1125  + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n"
1126  + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n"
1127  + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n"
1128  + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n"
1129  + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n"
1130  + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n"
1131  + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n"
1132  + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n"
1133  + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n"
1134  + "-----END RSA PRIVATE KEY-----\n";
1135
1136function TestPriKeyPkcs1ToPkcs8BySync1024() {
1137  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
1138  let keyPair = rsaGenerator.convertPemKeySync(null, priKeyPkcs1Str1024);
1139  let priPemKey = keyPair.priKey;
1140  let priString = priPemKey.getEncodedPem('PKCS8');
1141  console.info("[sync]TestPriKeyPkcs1ToPkcs8BySync1024 priString output is " + priString);
1142}
1143```
1144
1145## KeyPair
1146
1147非对称密钥对,包含:公钥与私钥。
1148
1149可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
1150
1151> **说明:**
1152>
1153> KeyPair对象中的pubKey对象和priKey对象,作为KeyPair对象中的一个参数存在,当离开KeyPair对象作用域时,其内部对象可能被析构。
1154>
1155> 业务方使用时应持有KeyPair对象的引用,而非内部pubKey或priKey对象的引用。
1156
1157### 属性
1158
1159**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1160
1161**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1162
1163API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
1164
1165| 名称    | 类型   | 可读 | 可写 | 说明           |
1166| ------- | ------ | ---- | ---- | ------------ |
1167| priKey  | [PriKey](#prikey) | 是   | 否   | 私钥。      |
1168| pubKey | [PubKey](#pubkey) | 是   | 否   | 公钥。       |
1169
1170## cryptoFramework.createSymKeyGenerator
1171
1172createSymKeyGenerator(algName: string): SymKeyGenerator
1173
1174通过指定算法名称的字符串,获取相应的对称密钥生成器实例。
1175
1176支持的规格详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)。
1177
1178**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1179
1180**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1181
1182API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey
1183
1184**参数:**
1185
1186| 参数名  | 类型   | 必填 | 说明                                                         |
1187| ------- | ------ | ---- | ------------------------------------------------------------ |
1188| algName | string | 是   | 待生成对称密钥生成器的算法名称。<br/>具体取值详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)一节中的“字符串参数”。 |
1189
1190**返回值:**
1191
1192| 类型                                | 说明                       |
1193| ----------------------------------- | -------------------------- |
1194| [SymKeyGenerator](#symkeygenerator) | 返回对称密钥生成器的对象。 |
1195
1196**错误码:**
1197以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1198
1199| 错误码ID | 错误信息               |
1200| -------- | ---------------------- |
1201| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1202| 801 | this operation is not supported. |
1203
1204**示例:**
1205
1206```ts
1207import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1208
1209let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1210```
1211
1212## SymKeyGenerator
1213
1214对称密钥生成器。
1215
1216在使用该类的方法前,需要先使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)方法构建一个SymKeyGenerator实例。
1217
1218### 属性
1219
1220**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1221
1222**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1223
1224API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey
1225
1226| 名称    | 类型   | 可读 | 可写 | 说明                           |
1227| ------- | ------ | ---- | ---- | ------------------------------ |
1228| algName | string | 是   | 否   | 对称密钥生成器指定的算法名称。 |
1229
1230### generateSymKey
1231
1232generateSymKey(callback: AsyncCallback\<SymKey>): void
1233
1234异步获取对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。
1235
1236必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1237
1238目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
1239
1240> **说明:**
1241>
1242> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如指定“HMAC|SHA256”会随机生成256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKey](#convertkey)方式生成对称密钥数据。
1243
1244**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1245
1246**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1247
1248API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey
1249
1250**参数:**
1251
1252| 参数名     | 类型                              | 必填 | 说明                                                         |
1253| -------- | --------------------------------- | ---- | ------------------------------------------------------------ |
1254| callback | AsyncCallback\<[SymKey](#symkey)> | 是   | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 |
1255
1256**错误码:**
1257以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1258
1259| 错误码ID | 错误信息      |
1260| -------- | ------------- |
1261| 17620001 | memory error. |
1262
1263**示例:**
1264
1265```ts
1266import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1267
1268let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1269  symKeyGenerator.generateSymKey((err, symKey) => {
1270    console.info('Generate symKey success, algName:' + symKey.algName);
1271  });
1272```
1273
1274### generateSymKey
1275
1276generateSymKey(): Promise\<SymKey>
1277
1278异步获取该对称密钥生成器随机生成的密钥,通过Promise获取结果。
1279
1280必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1281
1282目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
1283
1284**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1285
1286**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1287
1288API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey
1289
1290**返回值:**
1291
1292| 类型                        | 说明                              |
1293| --------------------------- | --------------------------------- |
1294| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 |
1295
1296**错误码:**
1297以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1298
1299| 错误码ID | 错误信息      |
1300| -------- | ------------- |
1301| 17620001 | memory error. |
1302
1303**示例:**
1304
1305```ts
1306import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1307import { BusinessError } from '@kit.BasicServicesKit';
1308
1309let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
1310  symKeyGenerator.generateSymKey()
1311    .then(symKey => {
1312      console.info('Generate symKey success, algName: ' + symKey.algName);
1313    }).catch((error: BusinessError) => {
1314      console.error(`Generate symKey failed, ${error.code}, ${error.message}`);
1315    });
1316```
1317
1318### generateSymKeySync<sup>12+</sup>
1319
1320generateSymKeySync(): SymKey
1321
1322同步获取对称密钥生成器随机生成的密钥。
1323
1324必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1325
1326目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
1327
1328> **说明:**
1329>
1330> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如指定“HMAC|SHA256”会随机生成256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKeySync](#convertkeysync12)方式生成对称密钥数据。
1331
1332**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1333
1334**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1335
1336**错误码:**
1337以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1338
1339| 错误码ID | 错误信息      |
1340| -------- | ------------- |
1341| 17620001 | memory error. |
1342
1343**示例:**
1344
1345```ts
1346import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1347
1348function testGenerateSymKeySync() {
1349  // 创建SymKeyGenerator实例
1350  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
1351  // 使用密钥生成器随机生成对称密钥
1352  let key = symKeyGenerator.generateSymKeySync();
1353  let encodedKey = key.getEncoded();
1354  console.info('key hex:' + encodedKey.data);
1355}
1356```
1357
1358### convertKey
1359
1360convertKey(key: DataBlob, callback: AsyncCallback\<SymKey>): void
1361
1362异步根据指定数据生成对称密钥,通过注册回调函数获取结果。
1363
1364必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1365
1366> **说明:**
1367>
1368> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如传入SHA256对应256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据。
1369
1370**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1371
1372**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1373
1374API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey
1375
1376**参数:**
1377
1378| 参数名     | 类型          | 必填 | 说明                       |
1379| -------- | ------------------- | ---- | ---------------------|
1380| key      | [DataBlob](#datablob)             | 是   | 指定的对称密钥材料。                                         |
1381| callback | AsyncCallback\<[SymKey](#symkey)> | 是   | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 |
1382
1383**错误码:**
1384以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1385
1386| 错误码ID | 错误信息                                               |
1387| -------- | --------------------------------------------------- |
1388| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1389| 17620001 | memory error.                                       |
1390
1391**示例:**
1392
1393```ts
1394import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1395
1396function genKeyMaterialBlob(): cryptoFramework.DataBlob {
1397  let arr = [
1398    0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
1399    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
1400    0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes)
1401  let keyMaterial = new Uint8Array(arr);
1402  return { data: keyMaterial };
1403}
1404
1405function testConvertKey() {
1406  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1407  let keyMaterialBlob = genKeyMaterialBlob();
1408  symKeyGenerator.convertKey(keyMaterialBlob, (err, symKey) => {
1409    console.info('Convert symKey success, algName: ' + symKey.algName);
1410  });
1411}
1412```
1413
1414### convertKey
1415
1416convertKey(key: DataBlob): Promise\<SymKey>
1417
1418异步根据指定数据生成对称密钥,通过Promise获取结果。
1419
1420必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1421
1422**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1423
1424**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1425
1426API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey
1427
1428**参数:**
1429
1430| 参数名 | 类型                  | 必填 | 说明                 |
1431| ---- | --------------------- | ---- | -------------------- |
1432| key  | [DataBlob](#datablob) | 是   | 指定的密钥材料数据。 |
1433
1434**返回值:**
1435
1436| 类型                        | 说明                              |
1437| --------------------------- | --------------------------------- |
1438| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 |
1439
1440**错误码:**
1441以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1442
1443| 错误码ID | 错误信息                                          |
1444| -------- | --------------------------------------------- |
1445| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1446| 17620001 | memory error.                                |
1447
1448**示例:**
1449
1450```ts
1451import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1452import { BusinessError } from '@kit.BasicServicesKit';
1453
1454function genKeyMaterialBlob(): cryptoFramework.DataBlob {
1455  let arr = [
1456    0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
1457    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
1458    0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes)
1459  let keyMaterial = new Uint8Array(arr);
1460  return { data: keyMaterial };
1461}
1462
1463function testConvertKey() {
1464  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1465  let keyMaterialBlob = genKeyMaterialBlob();
1466  symKeyGenerator.convertKey(keyMaterialBlob)
1467    .then(symKey => {
1468      console.info('Convert symKey success, algName:' + symKey.algName);
1469    }).catch((error: BusinessError) => {
1470      console.error(`Convert symKey failed, ${error.code}, ${error.message}`);
1471    });
1472}
1473```
1474
1475### convertKeySync<sup>12+</sup>
1476
1477convertKeySync(key: DataBlob): SymKey
1478
1479同步根据指定数据生成对称密钥。
1480
1481必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1482
1483> **说明:**
1484>
1485> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如传入SHA256对应256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据。
1486
1487**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1488
1489**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey
1490
1491**参数:**
1492
1493| 参数名     | 类型          | 必填 | 说明                       |
1494| -------- | ------------------- | ---- | ---------------------|
1495| key      | [DataBlob](#datablob)             | 是   | 指定的对称密钥材料。                                         |
1496
1497**错误码:**
1498以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1499
1500| 错误码ID | 错误信息                                               |
1501| -------- | --------------------------------------------------- |
1502| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1503| 17620001 | memory error.                                       |
1504
1505**示例:**
1506
1507```ts
1508import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1509import { buffer } from '@kit.ArkTS';
1510
1511function testConvertKeySync() {
1512  // 对称密钥长度为64字节,512比特
1513  let keyMessage = '87654321abcdefgh87654321abcdefgh87654321abcdefgh87654321abcdefgh';
1514  let keyBlob: cryptoFramework.DataBlob = {
1515    data : new Uint8Array(buffer.from(keyMessage, 'utf-8').buffer)
1516  }
1517  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC');
1518  let key = symKeyGenerator.convertKeySync(keyBlob);
1519  let encodedKey = key.getEncoded();
1520  console.info('key encoded data:' + encodedKey.data);
1521}
1522```
1523
1524## cryptoFramework.createAsyKeyGenerator
1525
1526createAsyKeyGenerator(algName: string): AsyKeyGenerator
1527
1528通过指定算法名称的字符串,获取相应的非对称密钥生成器实例。
1529
1530支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。
1531
1532**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1533
1534**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1535
1536API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
1537
1538**参数:**
1539
1540| 参数名  | 类型   | 必填 | 说明                             |
1541| ------- | ------ | ---- | -------------------------------- |
1542| algName | string | 是   | 待生成对称密钥生成器的算法名称。 |
1543
1544**返回值:**
1545
1546| 类型            | 说明                         |
1547| --------------- | ---------------------------- |
1548| [AsyKeyGenerator](#asykeygenerator) | 返回非对称密钥生成器的对象。 |
1549
1550**错误码:**
1551以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1552
1553| 错误码ID | 错误信息               |
1554| -------- | ---------------------- |
1555| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1556| 801 | this operation is not supported. |
1557| 17620001 | memory error. |
1558
1559**示例:**
1560
1561```ts
1562import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1563
1564let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1565```
1566
1567## AsyKeyGenerator
1568
1569非对称密钥生成器。在使用该类的方法前,需要先使用createAsyKeyGenerator()方法构建一个AsyKeyGenerator实例。
1570
1571### 属性
1572
1573**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1574
1575**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1576
1577API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
1578
1579| 名称    | 类型   | 可读 | 可写 | 说明                             |
1580| ------- | ------ | ---- | ---- | -------------------------------- |
1581| algName | string | 是   | 否   | 非对称密钥生成器指定的算法名称。 |
1582
1583### generateKeyPair
1584
1585generateKeyPair(callback: AsyncCallback\<KeyPair>): void
1586
1587异步获取非对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。
1588
1589**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1590
1591**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1592
1593API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
1594
1595**参数:**
1596
1597| 参数名     | 类型                    | 必填 | 说明                           |
1598| -------- | ----------------------- | ---- | ------------------------------ |
1599| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
1600
1601**错误码:**
1602以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1603
1604| 错误码ID | 错误信息               |
1605| -------- | ---------------------- |
1606| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types;|
1607| 17620001 | memory error.          |
1608| 17630001 | crypto operation error.          |
1609
1610**示例:**
1611
1612```ts
1613import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1614
1615let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1616asyKeyGenerator.generateKeyPair((err, keyPair) => {
1617  if (err) {
1618    console.error("generateKeyPair: error.");
1619    return;
1620  }
1621  console.info('generateKeyPair: success.');
1622})
1623```
1624
1625### generateKeyPair
1626
1627generateKeyPair(): Promise\<KeyPair>
1628
1629异步获取该非对称密钥生成器随机生成的密钥,通过Promise获取结果。
1630
1631**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1632
1633**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1634
1635API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
1636
1637**返回值:**
1638
1639| 类型              | 说明                              |
1640| ----------------- | --------------------------------- |
1641| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
1642
1643**错误码:**
1644以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1645
1646| 错误码ID | 错误信息               |
1647| -------- | ---------------------- |
1648| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
1649| 17620001 | memory error.          |
1650| 17630001 | crypto operation error.          |
1651
1652**示例:**
1653
1654```ts
1655import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1656import { BusinessError } from '@kit.BasicServicesKit';
1657
1658let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1659let keyGenPromise = asyKeyGenerator.generateKeyPair();
1660keyGenPromise.then(keyPair => {
1661  console.info('generateKeyPair success.');
1662}).catch((error: BusinessError) => {
1663  console.error("generateKeyPair error.");
1664});
1665```
1666
1667### generateKeyPairSync<sup>12+</sup>
1668
1669generateKeyPairSync(): KeyPair
1670
1671同步获取该非对称密钥生成器随机生成的密钥。
1672
1673**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1674
1675**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1676
1677**返回值:**
1678
1679| 类型              | 说明                              |
1680| ----------------- | --------------------------------- |
1681| [KeyPair](#keypair) | 非对称密钥。 |
1682
1683**错误码:**
1684以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1685
1686| 错误码ID | 错误信息               |
1687| -------- | ---------------------- |
1688| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.          |
1689| 17620001 | memory error.          |
1690| 17630001 | crypto operation error.          |
1691
1692**示例:**
1693
1694```ts
1695import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1696
1697let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1698try {
1699  let keyPairData = asyKeyGenerator.generateKeyPairSync();
1700  if (keyPairData != null) {
1701    console.info('[Sync]: key pair success');
1702  } else {
1703    console.error("[Sync]: get key pair result fail!");
1704  }
1705} catch (e) {
1706  console.error(`sync error, ${e.code}, ${e.message}`);
1707}
1708```
1709
1710### convertKey
1711
1712convertKey(pubKey: DataBlob | null, priKey: DataBlob | null, callback: AsyncCallback\<KeyPair\>): void
1713
1714异步获取指定数据生成非对称密钥,通过注册回调函数获取结果。详情请看下方**密钥转换说明**。
1715
1716**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1717
1718**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1719
1720API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
1721
1722**参数:**
1723
1724| 参数名     | 类型       | 必填 | 说明                           |
1725| -------- | ----------- | ---- | ------------------------------ |
1726| pubKey   | [DataBlob](#datablob) \| null<sup>10+</sup>    | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。        |
1727| priKey   | [DataBlob](#datablob) \| null<sup>10+</sup>   | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。        |
1728| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
1729
1730**错误码:**
1731以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1732
1733| 错误码ID | 错误信息               |
1734| -------- | ---------------------- |
1735| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1736| 17620001 | memory error.          |
1737| 17630001 | crypto operation error.          |
1738
1739**示例:**
1740
1741```ts
1742import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1743
1744let 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]);
1745let 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]);
1746let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据
1747let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据
1748let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1749asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => {
1750  if (err) {
1751    console.error("convertKey: error.");
1752    return;
1753  }
1754  console.info('convertKey: success.');
1755});
1756```
1757
1758### convertKey
1759
1760convertKey(pubKey: DataBlob | null, priKey: DataBlob | null): Promise\<KeyPair>
1761
1762异步获取指定数据生成非对称密钥,通过Promise获取结果。详情请看下方**密钥转换说明**。
1763
1764**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1765
1766**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1767
1768API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
1769
1770**参数:**
1771
1772| 参数名   | 类型    | 必填 | 说明             |
1773| ------ | -------- | ---- | ---------------- |
1774| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 |
1775| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 |
1776
1777**返回值:**
1778
1779| 类型              | 说明                              |
1780| ----------------- | --------------------------------- |
1781| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
1782
1783**错误码:**
1784以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1785
1786| 错误码ID | 错误信息               |
1787| -------- | ---------------------- |
1788| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1789| 17620001 | memory error.          |
1790| 17630001 | crypto operation error.          |
1791
1792**示例:**
1793
1794```ts
1795import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1796import { BusinessError } from '@kit.BasicServicesKit';
1797
1798let 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]);
1799let 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]);
1800let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据
1801let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据
1802let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1803let keyGenPromise = asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob);
1804keyGenPromise.then(keyPair => {
1805  console.info('convertKey success.');
1806}).catch((error: BusinessError) => {
1807  console.error("convertKey error.");
1808});
1809```
1810
1811### convertKeySync<sup>12+</sup>
1812
1813convertKeySync(pubKey: DataBlob | null, priKey: DataBlob | null): KeyPair
1814
1815同步获取指定数据生成非对称密钥。详情请看下方**密钥转换说明**。
1816
1817**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1818
1819**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1820
1821**参数:**
1822
1823| 参数名   | 类型    | 必填 | 说明             |
1824| ------ | -------- | ---- | ---------------- |
1825| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 |
1826| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 |
1827
1828**返回值:**
1829
1830| 类型              | 说明                              |
1831| ----------------- | --------------------------------- |
1832| [KeyPair](#keypair) | 非对称密钥。 |
1833
1834**错误码:**
1835以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1836
1837| 错误码ID | 错误信息               |
1838| -------- | ---------------------- |
1839| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
1840| 17620001 | memory error.          |
1841| 17630001 | crypto operation error.          |
1842
1843**示例:**
1844
1845```ts
1846import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1847
1848let 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]);
1849let 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]);
1850let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据
1851let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据
1852let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256');
1853try {
1854  let keyPairData = asyKeyGenerator.convertKeySync(pubKeyBlob, priKeyBlob);
1855  if (keyPairData != null) {
1856    console.info('[Sync]: key pair success');
1857  } else {
1858    console.error("[Sync]: convert key pair result fail!");
1859  }
1860} catch (e) {
1861  console.error(`sync error, ${e.code}, ${e.message}`);
1862}
1863```
1864
1865**密钥转换说明**
1866
18671. 非对称密钥(RSA、ECC、DSA)的公钥和私钥调用getEncoded()方法后,分别返回X.509格式和PKCS#8格式的二进制数据,其中对于ecc私钥,返回的是RFC5915定义格式。上述数据可用于跨应用传输或持久化存储。
18682. 当调用convertKey方法将外来二进制数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、DER编码格式,私钥应满足ASN.1语法、PKCS#8规范、DER编码格式。
18693. convertKey方法中,公钥和密钥二进制数据非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。
18704. convertKey或convertKeySync方法将外来二进制数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。
1871
1872### convertPemKey<sup>12+</sup>
1873
1874convertPemKey(pubKey: string | null, priKey: string | null): Promise\<KeyPair>
1875
1876异步获取指定数据生成非对称密钥,通过Promise获取结果。
1877
1878> **说明:**
1879> 1. 当调用convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、PEM编码格式,私钥应满足ASN.1语法、PKCS#8规范、PEM编码格式。
1880> 2. convertPemKey方法中,公钥和私钥字符串数据为非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。
1881> 3. convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。
1882
1883**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1884
1885**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1886
1887**参数:**
1888
1889| 参数名   | 类型    | 必填 | 说明             |
1890| ------ | -------- | ---- | ---------------- |
1891| pubKey | string \| null | 是  | 指定的公钥材料。如果公钥不需要转换,可直接传入null。|
1892| priKey | string \| null | 是  | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。|
1893
1894**返回值:**
1895
1896| 类型              | 说明                              |
1897| ----------------- | --------------------------------- |
1898| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
1899
1900**错误码:**
1901以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1902
1903| 错误码ID | 错误信息               |
1904| -------- | ---------------------- |
1905| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
1906| 17620001 | memory error.          |
1907| 17630001 | crypto operation error.          |
1908
1909**示例:**
1910
1911```ts
1912import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1913import { BusinessError } from '@kit.BasicServicesKit';
1914
1915let priKeyPkcs1Str1024: string  =
1916  "-----BEGIN RSA PRIVATE KEY-----\n"
1917  + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n"
1918  + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n"
1919  + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n"
1920  + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n"
1921  + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n"
1922  + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n"
1923  + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n"
1924  + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n"
1925  + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n"
1926  + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n"
1927  + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n"
1928  + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n"
1929  + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n"
1930  + "-----END RSA PRIVATE KEY-----\n";
1931  let publicPkcs1Str1024: string  =
1932  "-----BEGIN RSA PUBLIC KEY-----\n"
1933  + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n"
1934  + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n"
1935  + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n"
1936  + "-----END RSA PUBLIC KEY-----\n";
1937async function TestConvertPemKeyByPromise() {
1938  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
1939  let keyGenPromise = asyKeyGenerator.convertPemKey(publicPkcs1Str1024, priKeyPkcs1Str1024);
1940  keyGenPromise.then(keyPair => {
1941    console.info('convertPemKey success.');
1942  }).catch((error: BusinessError) => {
1943    console.error("convertPemKey error.");
1944  });
1945}
1946```
1947
1948### convertPemKeySync<sup>12+</sup>
1949
1950convertPemKeySync(pubKey: string | null, priKey: string | null): KeyPair
1951
1952同步获取指定数据生成非对称密钥。
1953
1954> **说明:**
1955> convertPemKeySync接口与convertPemKey接口注意事项相同,见[convertPemKey](#convertpemkey12)接口说明。
1956
1957**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1958
1959**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
1960
1961**参数:**
1962
1963| 参数名   | 类型    | 必填 | 说明             |
1964| ------ | -------- | ---- | ---------------- |
1965| pubKey | string \| null| 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。|
1966| priKey | string \| null| 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。|
1967
1968**返回值:**
1969
1970| 类型              | 说明                              |
1971| ----------------- | --------------------------------- |
1972| [KeyPair](#keypair) | 非对称密钥。 |
1973
1974**错误码:**
1975以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
1976
1977| 错误码ID | 错误信息               |
1978| -------- | ---------------------- |
1979| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
1980| 17620001 | memory error.          |
1981| 17630001 | crypto operation error.          |
1982
1983**示例:**
1984
1985```ts
1986import { cryptoFramework } from '@kit.CryptoArchitectureKit';
1987import { BusinessError } from '@kit.BasicServicesKit';
1988
1989let priKeyPkcs1Str1024: string  =
1990  "-----BEGIN RSA PRIVATE KEY-----\n"
1991  + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n"
1992  + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n"
1993  + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n"
1994  + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n"
1995  + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n"
1996  + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n"
1997  + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n"
1998  + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n"
1999  + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n"
2000  + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n"
2001  + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n"
2002  + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n"
2003  + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n"
2004  + "-----END RSA PRIVATE KEY-----\n";
2005  let publicPkcs1Str1024: string  =
2006  "-----BEGIN RSA PUBLIC KEY-----\n"
2007  + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n"
2008  + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n"
2009  + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n"
2010  + "-----END RSA PUBLIC KEY-----\n";
2011function TestConvertPemKeyBySync() {
2012  let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
2013  try {
2014    let keyPairData = asyKeyGenerator.convertPemKeySync(publicPkcs1Str1024, priKeyPkcs1Str1024);
2015    if (keyPairData != null) {
2016      console.info('[Sync]: convert pem key pair success');
2017    } else {
2018      console.error("[Sync]: convert pem key pair result fail!");
2019    }
2020  } catch (e) {
2021    console.error(`Sync error, ${e.code}, ${e.message}`);
2022  }
2023}
2024```
2025
2026## cryptoFramework.createAsyKeyGeneratorBySpec<sup>10+</sup>
2027
2028createAsyKeyGeneratorBySpec(asyKeySpec: AsyKeySpec): AsyKeyGeneratorBySpec
2029
2030通过指定密钥参数,获取相应的非对称密钥生成器实例。
2031
2032支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。
2033
2034**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2035
2036**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2037
2038API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2039
2040**参数:**
2041
2042| 参数名  | 类型   | 必填 | 说明                             |
2043| ------- | ------ | ---- | -------------------------------- |
2044| asyKeySpec | [AsyKeySpec](#asykeyspec10) | 是   | 密钥参数。非对称密钥生成器根据指定的这些参数生成公/私钥。 |
2045
2046**返回值:**
2047
2048| 类型                                            | 说明                       |
2049| ----------------------------------------------- | -------------------------- |
2050| [AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10) | 返回非对称密钥生成器实例。 |
2051
2052**错误码:**
2053以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2054
2055| 错误码ID | 错误信息               |
2056| -------- | ---------------------- |
2057| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2058| 801 | this operation is not supported. |
2059| 17620001 | memory error. |
2060
2061**示例:**
2062
2063```ts
2064import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2065
2066// 配置DSA1024公钥和私钥中包含的公共参数
2067function genDsa1024CommonSpecBigE() {
2068  let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = {
2069    algName: "DSA",
2070    specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
2071    p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
2072    q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
2073    g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
2074  }
2075  return dsaCommonSpec;
2076}
2077
2078// 设置DSA1024密钥对中包含的全参数
2079function genDsa1024KeyPairSpecBigE() {
2080  let dsaCommonSpec = genDsa1024CommonSpecBigE();
2081  let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = {
2082    algName: "DSA",
2083    specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
2084    params: dsaCommonSpec,
2085    sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
2086    pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
2087  }
2088  return dsaKeyPairSpec;
2089}
2090
2091let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format.
2092let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2093```
2094
2095## AsyKeyGeneratorBySpec<sup>10+</sup>
2096
2097非对称密钥生成器。在使用该类的方法前,需要先使用[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法构建一个AsyKeyGeneratorBySpec实例。
2098
2099### 属性
2100
2101**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2102
2103**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2104
2105API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2106
2107| 名称    | 类型   | 可读 | 可写 | 说明                       |
2108| ------- | ------ | ---- | ---- | -------------------------- |
2109| algName | string | 是   | 否   | 非对称密钥生成器的算法名。 |
2110
2111### generateKeyPair
2112
2113generateKeyPair(callback: AsyncCallback\<KeyPair>): void
2114
2115异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。
2116
2117当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。
2118
2119**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2120
2121**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2122
2123API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2124
2125**参数:**
2126
2127| 参数名     | 类型                    | 必填 | 说明                           |
2128| -------- | ----------------------- | ---- | ------------------------------ |
2129| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
2130
2131**错误码:**
2132以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2133
2134| 错误码ID | 错误信息                |
2135| -------- | ----------------------- |
2136| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types;         |
2137| 17620001 | memory error.           |
2138| 17630001 | crypto operation error. |
2139
2140**示例:**
2141
2142<!--code_no_check-->
2143```ts
2144let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2145let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2146asyKeyGeneratorBySpec.generateKeyPair((err, keyPair) => {
2147  if (err) {
2148    console.error("generateKeyPair: error.");
2149    return;
2150  }
2151  console.info('generateKeyPair: success.');
2152})
2153```
2154
2155### generateKeyPair
2156
2157generateKeyPair(): Promise\<KeyPair>
2158
2159异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。
2160
2161当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。
2162
2163**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2164
2165**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2166
2167API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2168
2169**返回值:**
2170
2171| 类型              | 说明                              |
2172| ----------------- | --------------------------------- |
2173| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
2174
2175**错误码:**
2176以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2177
2178| 错误码ID | 错误信息               |
2179| -------- | ---------------------- |
2180| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.        |
2181| 17620001 | memory error.          |
2182| 17630001 | crypto operation error. |
2183
2184**示例:**
2185
2186<!--code_no_check-->
2187```ts
2188import { BusinessError } from '@kit.BasicServicesKit';
2189
2190let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2191let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2192let keyGenPromise = asyKeyGeneratorBySpec.generateKeyPair();
2193keyGenPromise.then(keyPair => {
2194  console.info('generateKeyPair success.');
2195}).catch((error: BusinessError) => {
2196  console.error("generateKeyPair error.");
2197});
2198```
2199
2200### generateKeyPairSync<sup>12+</sup>
2201
2202generateKeyPairSync(): KeyPair
2203
2204同步获取该非对称密钥生成器生成的密钥。
2205
2206当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。
2207
2208**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2209
2210**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2211
2212**返回值:**
2213
2214| 类型              | 说明                              |
2215| ----------------- | --------------------------------- |
2216| [KeyPair](#keypair) | 非对称密钥。 |
2217
2218**错误码:**
2219以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2220
2221| 错误码ID | 错误信息               |
2222| -------- | ---------------------- |
2223| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2224| 17620001 | memory error.          |
2225| 17630001 | crypto operation error. |
2226
2227**示例:**
2228
2229<!--code_no_check-->
2230```ts
2231import { BusinessError } from '@kit.BasicServicesKit';
2232
2233let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2234let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2235try {
2236  let keyPairData = asyKeyGeneratorBySpec.generateKeyPairSync();
2237  if (keyPairData != null) {
2238    console.info('[Sync]: key pair success');
2239  } else {
2240    console.error("[Sync]: get key pair result fail!");
2241  }
2242} catch (error) {
2243  let e: BusinessError = error as BusinessError;
2244  console.error(`sync error, ${e.code}, ${e.message}`);
2245}
2246```
2247
2248### generatePriKey
2249
2250generatePriKey(callback: AsyncCallback\<PriKey>): void
2251
2252异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。
2253
2254当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。
2255
2256**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2257
2258**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2259
2260API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2261
2262**参数:**
2263
2264| 参数名     | 类型                    | 必填 | 说明                           |
2265| -------- | ----------------------- | ---- | ------------------------------ |
2266| callback | AsyncCallback\<[PriKey](#prikey)> | 是   | 回调函数,用于获取非对称密钥。 |
2267
2268**错误码:**
2269以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2270
2271| 错误码ID | 错误信息               |
2272| -------- | ---------------------- |
2273| 401 | invalid parameters. Possible causes: <br>Mandatory parameters are left unspecified;         |
2274| 17620001 | memory error.          |
2275| 17630001 | crypto operation error. |
2276
2277**示例:**
2278
2279<!--code_no_check-->
2280```ts
2281let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2282let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2283asyKeyGeneratorBySpec.generatePriKey((err, prikey) => {
2284  if (err) {
2285    console.error("generatePriKey: error.");
2286    return;
2287  }
2288  console.info('generatePriKey: success.');
2289})
2290```
2291
2292### generatePriKey
2293
2294generatePriKey(): Promise\<PriKey>
2295
2296异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。
2297
2298当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。
2299
2300**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2301
2302**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2303
2304API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2305
2306**返回值:**
2307
2308| 类型              | 说明                              |
2309| ----------------- | --------------------------------- |
2310| Promise\<[PriKey](#prikey)> | 使用Promise的方式获取非对称密钥。 |
2311
2312**错误码:**
2313以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2314
2315| 错误码ID | 错误信息               |
2316| -------- | ---------------------- |
2317| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2318| 17620001 | memory error.          |
2319| 17630001 | crypto operation error. |
2320
2321**示例:**
2322
2323<!--code_no_check-->
2324```ts
2325import { BusinessError } from '@kit.BasicServicesKit';
2326
2327let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2328let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2329let keyGenPromise = asyKeyGeneratorBySpec.generatePriKey();
2330keyGenPromise.then(priKey => {
2331  console.info('generatePriKey success.');
2332}).catch((error: BusinessError) => {
2333  console.error("generatePriKey error.");
2334});
2335```
2336
2337### generatePriKeySync<sup>12+</sup>
2338
2339generatePriKeySync(): PriKey
2340
2341同步获取该非对称密钥生成器生成的密钥。
2342
2343当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。
2344
2345**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2346
2347**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2348
2349**返回值:**
2350
2351| 类型              | 说明                              |
2352| ----------------- | --------------------------------- |
2353| [PriKey](#prikey) | 非对称密钥。 |
2354
2355**错误码:**
2356以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2357
2358| 错误码ID | 错误信息               |
2359| -------- | ---------------------- |
2360| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.        |
2361| 17620001 | memory error.          |
2362| 17630001 | crypto operation error. |
2363
2364**示例:**
2365
2366<!--code_no_check-->
2367```ts
2368let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2369let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2370try {
2371  let priKeyData = asyKeyGeneratorBySpec.generatePriKeySync();
2372  if (priKeyData != null) {
2373    console.info('[Sync]: pri key success');
2374  } else {
2375    console.error("[Sync]: get pri key result fail!");
2376  }
2377} catch (e) {
2378  console.error(`sync error, ${e.code}, ${e.message}`);
2379}
2380```
2381
2382### generatePubKey
2383
2384generatePubKey(callback: AsyncCallback\<PubKey>): void
2385
2386异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。
2387
2388当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。
2389
2390**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2391
2392**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2393
2394API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2395
2396**参数:**
2397
2398| 参数名     | 类型                    | 必填 | 说明                           |
2399| -------- | ----------------------- | ---- | ------------------------------ |
2400| callback | AsyncCallback\<[PubKey](#pubkey)> | 是   | 回调函数,用于获取非对称密钥。 |
2401
2402**错误码:**
2403以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2404
2405| 错误码ID | 错误信息               |
2406| -------- | ---------------------- |
2407| 401 | invalid parameters. Possible causes:<br> Incorrect parameter types;        |
2408| 17620001 | memory error.          |
2409| 17630001 | crypto operation error. |
2410
2411**示例:**
2412
2413<!--code_no_check-->
2414```ts
2415let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2416let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2417asyKeyGeneratorBySpec.generatePubKey((err, pubKey) => {
2418  if (err) {
2419    console.error("generatePubKey: error.");
2420    return;
2421  }
2422  console.info('generatePubKey: success.');
2423})
2424```
2425
2426### generatePubKey
2427
2428generatePubKey(): Promise\<PubKey>
2429
2430异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。
2431
2432当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。
2433
2434**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2435
2436**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2437
2438API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2439
2440**返回值:**
2441
2442| 类型              | 说明                              |
2443| ----------------- | --------------------------------- |
2444| Promise\<[PubKey](#pubkey)> | 使用Promise的方式获取非对称密钥。 |
2445
2446**错误码:**
2447以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2448
2449| 错误码ID | 错误信息               |
2450| -------- | ---------------------- |
2451| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
2452| 17620001 | memory error.          |
2453| 17630001 | crypto operation error. |
2454
2455**示例:**
2456
2457<!--code_no_check-->
2458```ts
2459import { BusinessError } from '@kit.BasicServicesKit';
2460
2461let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2462let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2463let keyGenPromise = asyKeyGeneratorBySpec.generatePubKey();
2464keyGenPromise.then(pubKey => {
2465  console.info('generatePubKey success.');
2466}).catch((error: BusinessError) => {
2467  console.error("generatePubKey error.");
2468});
2469```
2470
2471### generatePubKeySync<sup>12+</sup>
2472
2473generatePubKeySync(): PubKey
2474
2475同步获取该非对称密钥生成器生成的密钥。
2476
2477当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。
2478
2479**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2480
2481**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2482
2483**返回值:**
2484
2485| 类型              | 说明                              |
2486| ----------------- | --------------------------------- |
2487| [PubKey](#pubkey) | 非对称密钥。 |
2488
2489**错误码:**
2490以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2491
2492| 错误码ID | 错误信息               |
2493| -------- | ---------------------- |
2494| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.        |
2495| 17620001 | memory error.          |
2496| 17630001 | crypto operation error. |
2497
2498**示例:**
2499
2500<!--code_no_check-->
2501```ts
2502let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here.
2503let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
2504try {
2505  let pubKeyData = asyKeyGeneratorBySpec.generatePubKeySync();
2506  if (pubKeyData != null) {
2507    console.info('[Sync]: pub key success');
2508  } else {
2509    console.error("[Sync]: get pub key result fail!");
2510  }
2511} catch (e) {
2512  console.error(`sync error, ${e.code}, ${e.message}`);
2513}
2514```
2515
2516## ECCKeyUtil<sup>11+</sup>
2517
2518根据椭圆曲线名生成相应的非对称公共密钥参数。
2519
2520### genECCCommonParamsSpec<sup>11+</sup>
2521
2522static genECCCommonParamsSpec(curveName: string): ECCCommonParamsSpec
2523
2524根据椭圆曲线相应的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)。
2525
2526**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2527
2528**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2529
2530API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2531
2532**参数:**
2533
2534| 参数名  | 类型   | 必填 | 说明                                           |
2535| ------- | ------ | ---- | ---------------------------------------------- |
2536| curveName | string | 是   | 椭圆曲线相应的NID(Name IDentifier)字符串名称。 |
2537
2538**返回值:**
2539
2540| 类型              | 说明                              |
2541| ----------------- | --------------------------------- |
2542| [ECCCommonParamsSpec](#ecccommonparamsspec10) | 返回ECC公共密钥参数。 |
2543
2544**错误码:**
2545以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2546
2547| 错误码ID | 错误信息                         |
2548| -------- | -------------------------------- |
2549| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2550| 801      | this operation is not supported. |
2551| 17620001 | memory error.                    |
2552
2553**示例:**
2554
2555```ts
2556import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2557import { BusinessError } from '@kit.BasicServicesKit';
2558try {
2559    let ECCCommonParamsSpec = cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_brainpoolP160r1');
2560    console.info('genECCCommonParamsSpec success');
2561} catch (err) {
2562    let e: BusinessError = err as BusinessError;
2563    console.error(`genECCCommonParamsSpec error, ${e.code}, ${e.message}`);
2564}
2565```
2566
2567### convertPoint<sup>12+</sup>
2568
2569static convertPoint(curveName: string, encodedPoint: Uint8Array): Point
2570
2571根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),将指定的点数据转换为Point对象。当前支持压缩/非压缩格式的点数据。
2572
2573> **说明:**
2574>
2575> 根据RFC5480规范中第2.2节的描述:<br/>
2576> 1. 非压缩的点数据,表示为:前缀0x04\|x坐标\|y坐标;
2577> 2. 压缩的点数据,对于Fp素数域上的点(当前暂不支持F2m域),表示为:前缀0x03\|x坐标 (坐标y是奇数时),前缀0x02\|x坐标 (坐标y是偶数时)。
2578
2579**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2580
2581**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2582
2583**参数:**
2584
2585| 参数名       | 类型        | 必填 | 说明                                           |
2586| ------------ | ---------- | ---- | ---------------------------------------------- |
2587| curveName    | string     | 是   | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 |
2588| encodedPoint | Uint8Array | 是   | 指定的ECC椭圆曲线上的点的数据。 |
2589
2590**返回值:**
2591
2592| 类型              | 说明                 |
2593| ----------------- | ------------------- |
2594| [Point](#point10) | 返回ECC的Point对象。 |
2595
2596**错误码:**
2597以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2598
2599| 错误码ID | 错误信息               |
2600| -------- | ---------------------- |
2601| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2602| 17620001 | memory error. |
2603| 17630001 | crypto operation error. |
2604
2605**示例:**
2606
2607```ts
2608import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2609
2610// 随机生成的非压缩点数据
2611let 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]);
2612let returnPoint = cryptoFramework.ECCKeyUtil.convertPoint('NID_brainpoolP256r1', pkData);
2613console.info('returnPoint: ' + returnPoint.x.toString(16));
2614```
2615
2616### getEncodedPoint<sup>12+</sup>
2617
2618static getEncodedPoint(curveName: string, point: Point, format: string): Uint8Array
2619
2620根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),按照指定的点数据格式,将Point对象转换为点数据。当前支持压缩/非压缩格式的点数据。
2621
2622**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2623
2624**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2625
2626**参数:**
2627
2628| 参数名       | 类型               | 必填 | 说明                                           |
2629| ------------ | ----------------- | ---- | ---------------------------------------------- |
2630| curveName    | string            | 是   | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 |
2631| point        | [Point](#point10) | 是   | 椭圆曲线上的Point点对象。 |
2632| format       | string            | 是   | 需要获取的点数据格式,当前支持"COMPRESSED"或"UNCOMPRESSED"。 |
2633
2634**返回值:**
2635
2636| 类型              | 说明                              |
2637| ----------------- | --------------------------------- |
2638| Uint8Array | 返回指定格式的点数据。 |
2639
2640**错误码:**
2641以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2642
2643| 错误码ID | 错误信息               |
2644| -------- | ---------------------- |
2645| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2646| 17620001 | memory error. |
2647| 17630001 | crypto operation error. |
2648
2649**示例:**
2650
2651```ts
2652import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2653
2654async function doTest() {
2655  let generator = cryptoFramework.createAsyKeyGenerator('ECC_BrainPoolP256r1');
2656  let keyPair = await generator.generateKeyPair();
2657  let eccPkX = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_X_BN);
2658  let eccPkY = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_Y_BN);
2659  console.info('ECC_PK_X_BN 16:' + eccPkX.toString(16));
2660  console.info('ECC_PK_Y_BN 16:' + eccPkY.toString(16));
2661  // 将eccPkX.toString(16)结果放入x,eccPkY.toString(16)结果放入y
2662  let returnPoint: cryptoFramework.Point = {
2663    x: BigInt('0x' + eccPkX.toString(16)),
2664    y: BigInt('0x' + eccPkY.toString(16))
2665  };
2666  let returnData = cryptoFramework.ECCKeyUtil.getEncodedPoint('NID_brainpoolP256r1', returnPoint, 'UNCOMPRESSED');
2667  console.info('returnData: ' + returnData);
2668}
2669```
2670
2671## DHKeyUtil<sup>11+</sup>
2672
2673根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。
2674
2675### genDHCommonParamsSpec<sup>11+</sup>
2676
2677static genDHCommonParamsSpec(pLen: number, skLen?: number): DHCommonParamsSpec
2678
2679根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。详见[DH密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#dh)。
2680
2681**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2682
2683**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey
2684
2685API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey
2686
2687**参数:**
2688
2689| 参数名 | 类型   | 必填 | 说明                                             |
2690| ------ | ------ | ---- | ------------------------------------------------ |
2691| pLen   | number | 是   | 用于指定DH公共密钥参数中素数P的长度,单位为bit。 |
2692| skLen  | number | 否   | 用于指定DH公共密钥参数中私钥的长度,单位为bit。  |
2693
2694**返回值:**
2695
2696| 类型              | 说明                              |
2697| ----------------- | --------------------------------- |
2698| [DHCommonParamsSpec](#dhcommonparamsspec11) | 返回DH公共密钥参数。 |
2699
2700**错误码:**
2701以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2702
2703| 错误码ID | 错误信息                         |
2704| -------- | -------------------------------- |
2705| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2706| 801      | this operation is not supported. |
2707| 17620001 | memory error.                    |
2708| 17630001 | crypto operation error.          |
2709
2710**示例:**
2711
2712```ts
2713import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2714import { BusinessError } from '@kit.BasicServicesKit';
2715try {
2716    let DHCommonParamsSpec = cryptoFramework.DHKeyUtil.genDHCommonParamsSpec(2048);
2717    console.info('genDHCommonParamsSpec success');
2718} catch (err) {
2719    let e: BusinessError = err as BusinessError;
2720    console.error(`genDHCommonParamsSpec error, ${e.code}, ${e.message}`);
2721}
2722```
2723
2724## SM2CryptoUtil<sup>12+</sup>
2725
2726用于SM2密码学运算的工具类。
2727
2728### genCipherTextBySpec<sup>12+</sup>
2729
2730static genCipherTextBySpec(spec: SM2CipherTextSpec, mode?: string): DataBlob
2731
2732根据指定的SM2密文参数,生成符合国密标准的ASN.1格式的SM2密文。
2733
2734**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2735
2736**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
2737
2738**参数:**
2739
2740| 参数名 | 类型   | 必填 | 说明                                             |
2741| ------ | ------ | ---- | ------------------------------------------------ |
2742| spec   | [SM2CipherTextSpec](#sm2ciphertextspec12) | 是   | 指定的SM2密文参数。 |
2743| mode  | string | 否   | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。  |
2744
2745**返回值:**
2746
2747| 类型              | 说明                              |
2748| ----------------- | --------------------------------- |
2749| [DataBlob](#datablob) | 返回符合国密标准的ASN.1格式的SM2密文。 |
2750
2751**错误码:**
2752以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2753
2754| 错误码ID | 错误信息                         |
2755| -------- | -------------------------------- |
2756| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2757| 17620001 | memory error.                    |
2758| 17630001 | crypto operation error.          |
2759
2760**示例:**
2761
2762```ts
2763import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2764import { BusinessError } from '@kit.BasicServicesKit';
2765try {
2766  let spec : cryptoFramework.SM2CipherTextSpec = {
2767    xCoordinate: BigInt('20625015362595980457695435345498579729138244358573902431560627260141789922999'),
2768    yCoordinate: BigInt('48563164792857017065725892921053777369510340820930241057309844352421738767712'),
2769    cipherTextData: new Uint8Array([100,227,78,195,249,179,43,70,242,69,169,10,65,123]),
2770    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]),
2771  }
2772  let data = cryptoFramework.SM2CryptoUtil.genCipherTextBySpec(spec, 'C1C3C2');
2773  console.info('genCipherTextBySpec success');
2774} catch (err) {
2775  let e: BusinessError = err as BusinessError;
2776  console.error(`genCipherTextBySpec error, ${e.code}, ${e.message}`);
2777}
2778```
2779
2780### getCipherTextSpec<sup>12+</sup>
2781
2782static getCipherTextSpec(cipherText: DataBlob, mode?: string): SM2CipherTextSpec
2783
2784从符合国密标准的ASN.1格式的SM2密文中,获取具体的SM2密文参数。
2785
2786**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2787
2788**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
2789
2790**参数:**
2791
2792| 参数名 | 类型   | 必填 | 说明                                             |
2793| ------ | ------ | ---- | ------------------------------------------------ |
2794| cipherText     | [DataBlob](#datablob)                 | 是   | 符合国密标准的ASN.1格式的SM2密文。
2795| mode  | string | 否   | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。  |
2796
2797**返回值:**
2798
2799| 类型              | 说明                              |
2800| ----------------- | --------------------------------- |
2801| [SM2CipherTextSpec](#sm2ciphertextspec12) | 返回具体的SM2密文参数。 |
2802
2803**错误码:**
2804以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2805
2806| 错误码ID | 错误信息                         |
2807| -------- | -------------------------------- |
2808| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2809| 17620001 | memory error.                    |
2810| 17630001 | crypto operation error.          |
2811
2812```ts
2813import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2814import { BusinessError } from '@kit.BasicServicesKit';
2815try {
2816    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]);
2817    let cipherText : cryptoFramework.DataBlob = {data : cipherTextArray};
2818    let spec : cryptoFramework.SM2CipherTextSpec = cryptoFramework.SM2CryptoUtil.getCipherTextSpec(cipherText, 'C1C3C2');
2819    console.info('getCipherTextSpec success');
2820} catch (err) {
2821    let e: BusinessError = err as BusinessError;
2822    console.error(`getCipherTextSpec error, ${e.code}, ${e.message}`);
2823}
2824```
2825
2826## cryptoFramework.createCipher
2827
2828createCipher(transformation: string): Cipher
2829
2830通过指定算法名称,获取相应的[Cipher](#cipher)实例。
2831
2832支持的规格详见[对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-sym-encrypt-decrypt-spec.md)和[非对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md)。
2833
2834**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2835
2836**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
2837
2838API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
2839
2840**参数:**
2841
2842| 参数名         | 类型   | 必填 | 说明                                                         |
2843| -------------- | ------ | ---- | ------------------------------------------------------------ |
2844| transformation | string | 是   | 待生成Cipher的算法名称(含密钥长度)、加密模式以及填充方法的组合。 |
2845
2846> **说明:**
2847>
2848> 1. 目前对称加解密中,PKCS5和PKCS7的实现相同,其padding长度和分组长度保持一致(即PKCS5和PKCS7在3DES中均按照8字节填充,在AES中均按照16字节填充),另有NoPadding表示不填充。
2849> <br/>开发者需要自行了解密码学不同分组模式的差异,以便选择合适的参数规格。例如选择ECB和CBC模式时,建议启用填充,否则必须确保明文长度是分组大小的整数倍;选择其他模式时,可以不启用填充,此时密文长度和明文长度一致(即可能不是分组大小的整数倍)。
2850> 2. 使用RSA、SM2进行非对称加解密时,必须创建两个Cipher对象分别进行加密和解密操作,而不能对同一个Cipher对象进行加解密。对称加解密没有此要求(即只要算法规格一样,可以对同一个Cipher对象进行加解密操作)。
2851
2852**返回值:**
2853
2854| 类型              | 说明                     |
2855| ----------------- | ------------------------ |
2856| [Cipher](#cipher) | 返回加解密生成器的对象。 |
2857
2858**错误码:**
2859以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2860
2861| 错误码ID | 错误信息               |
2862| -------- | ---------------------- |
2863| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2864| 801 | this operation is not supported. |
2865| 17620001 | memory error.          |
2866
2867**示例:**
2868
2869```ts
2870import { cryptoFramework } from '@kit.CryptoArchitectureKit';
2871import { BusinessError } from '@kit.BasicServicesKit';
2872
2873let cipherAlgName = '3DES192|ECB|PKCS7';
2874try {
2875  let cipher = cryptoFramework.createCipher(cipherAlgName);
2876  console.info('cipher algName:' + cipher.algName);
2877} catch (error) {
2878  let e: BusinessError = error as BusinessError;
2879  console.error(`sync error, ${e.code}, ${e.message}`);
2880}
2881```
2882
2883## Cipher
2884
2885提供加解密的算法操作功能,按序调用本类中的[init()](#init-1)、[update()](#update)、[doFinal()](#dofinal)方法,可以实现对称加密/对称解密/非对称加密/非对称解密。
2886
2887完整的加解密流程示例可参考开发指导中的[加解密开发指导](../../security/CryptoArchitectureKit/crypto-encryption-decryption-overview.md)。
2888
2889一次完整的加/解密流程在对称加密和非对称加密中略有不同:
2890
2891- 对称加解密:init为必选,update为可选(且允许多次update加/解密大数据),doFinal为必选;doFinal结束后可以重新init开始新一轮加/解密流程。
2892- RSA、SM2非对称加解密:init为必选,不支持update操作,doFinal为必选(允许连续多次doFinal加/解密大数据);RSA不支持重复init,切换加解密模式或填充方式时,需要重新创建Cipher对象。
2893
2894### 属性
2895
2896**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2897
2898**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
2899
2900API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
2901
2902| 名称    | 类型   | 可读 | 可写 | 说明                         |
2903| ------- | ------ | ---- | ---- | ---------------------------- |
2904| algName | string | 是   | 否   | 加解密生成器指定的算法名称。 |
2905
2906### init
2907
2908init(opMode: CryptoMode, key: Key, params: ParamsSpec | null, callback: AsyncCallback\<void>): void
2909
2910初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。
2911
2912必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
2913
2914**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2915
2916**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
2917
2918API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
2919
2920**参数:**
2921
2922| 参数名     | 类型                      | 必填 | 说明                                                         |
2923| -------- | ------------------------- | ---- | ------------------------------------------------------------ |
2924| opMode   | [CryptoMode](#cryptomode) | 是   | 加密或者解密模式。                                           |
2925| key      | [Key](#key)               | 是   | 指定加密或解密的密钥。                                       |
2926| params   | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前只支持ParamsSpec, API 10之后增加支持null。 |
2927| callback | AsyncCallback\<void>      | 是   | 回调函数。当加解密初始化成功,err为undefined,否则为错误对象。     |
2928
2929**错误码:**
2930以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2931
2932| 错误码ID | 错误信息                                                 |
2933| -------- | --------------------------------------------------------- |
2934| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2935| 17620001 | memory error.                                            |
2936| 17620002 | runtime error.                                           |
2937| 17630001 | crypto operation error.|
2938
2939### init
2940
2941init(opMode: CryptoMode, key: Key, params: ParamsSpec | null): Promise\<void>
2942
2943初始化加解密的cipher对象,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。
2944
2945必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
2946
2947**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2948
2949**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
2950
2951API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
2952
2953**参数:**
2954
2955| 参数名   | 类型                      | 必填 | 说明                                                         |
2956| ------ | ------------------------- | ---- | ------------------------------------------------------------ |
2957| opMode | [CryptoMode](#cryptomode) | 是   | 加密或者解密模式。                                           |
2958| key    | [Key](#key)               | 是   | 指定加密或解密的密钥。                                       |
2959| params | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前只支持ParamsSpec, API 10之后增加支持null。 |
2960
2961**返回值:**
2962
2963| 类型           | 说明                                   |
2964| -------------- | -------------------------------------- |
2965| Promise\<void> | 无返回结果的Promise对象。 |
2966
2967**错误码:**
2968以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2969
2970| 错误码ID | 错误信息                                          |
2971| -------- | ------------------------------------------------- |
2972| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
2973| 17620001 | memory error.                                     |
2974| 17620002 | runtime error.                                    |
2975| 17630001 | crypto operation error.|
2976
2977### initSync<sup>12+</sup>
2978
2979initSync(opMode: CryptoMode, key: Key, params: ParamsSpec | null): void
2980
2981初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。
2982
2983必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
2984
2985**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2986
2987**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
2988
2989**参数:**
2990
2991| 参数名 | 类型                                            | 必填 | 说明                                                         |
2992| ------ | ----------------------------------------------- | ---- | ------------------------------------------------------------ |
2993| opMode | [CryptoMode](#cryptomode)                       | 是   | 加密或者解密模式。                                           |
2994| key    | [Key](#key)                                     | 是   | 指定加密或解密的密钥。                                       |
2995| params | [ParamsSpec](#paramsspec)  | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 |
2996
2997**错误码:**
2998以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
2999
3000| 错误码ID | 错误信息                |
3001| -------- | ----------------------- |
3002| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3003| 17620001 | memory error.           |
3004| 17620002 | runtime error.          |
3005| 17630001 | crypto operation error. |
3006
3007### update
3008
3009update(data: DataBlob, callback: AsyncCallback\<DataBlob>): void
3010
3011分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。
3012
3013必须在对[Cipher](#cipher)实例使用[init()](#init-1)初始化后,才能使用本函数。
3014
3015> **说明:**
3016>
3017> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和doFinal结果产生影响。<br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。)
3018> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。<br/>
3019>    算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,采用多次update的方式传入数据。<br/>
3020>    AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。
3021> 3. RSA、SM2非对称加解密不支持update操作。
3022> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。
3023
3024**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3025
3026**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3027
3028API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
3029
3030**参数:**
3031
3032| 参数名     | 类型                                  | 必填 | 说明                                                         |
3033| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
3034| data     | [DataBlob](#datablob)                 | 是   | 加密或者解密的数据。data不能为null。           |
3035| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。当更新加/解密数据成功,err为undefined,data为此次更新的加/解密结果DataBlob;否则为错误对象。 |
3036
3037**错误码:**
3038以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3039
3040| 错误码ID | 错误信息                                    |
3041| -------- | ------------------------------------------- |
3042| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3043| 17620001 | memory error.                               |
3044| 17620002 | runtime error.                              |
3045| 17630001 | crypto operation error.                     |
3046
3047### update
3048
3049update(data: DataBlob): Promise\<DataBlob>
3050
3051分段更新加密或者解密数据操作,通过Promise获取加/解密数据。
3052
3053必须在对[Cipher](#cipher)实例使用[init()](#init-2)初始化后,才能使用本函数。
3054
3055> **说明:**
3056>
3057> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和doFinal结果产生影响。
3058> <br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。)
3059> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。<br/>
3060>    算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,可以采用多次update的方式传入数据。<br/>
3061>    AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。
3062> 3. RSA、SM2非对称加解密不支持update操作。
3063> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。
3064
3065**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3066
3067**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3068
3069API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
3070
3071**参数:**
3072
3073| 参数名 | 类型                  | 必填 | 说明                 |
3074| ---- | --------------------- | ---- | -------------------- |
3075| data | [DataBlob](#datablob) | 是   | 加密或者解密的数据。data不能为null。 |
3076
3077**返回值:**
3078
3079| 类型                            | 说明                                             |
3080| ------------------------------- | ------------------------------------------------ |
3081| Promise\<[DataBlob](#datablob)> | Promise对象,返回此次更新的加/解密结果DataBlob。 |
3082
3083**错误码:**
3084以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3085
3086| 错误码ID | 错误信息                                     |
3087| -------- | -------------------------------------------- |
3088| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3089| 17620001 | memory error.                                |
3090| 17620002 | runtime error.                               |
3091| 17630001 | crypto operation error.                      |
3092
3093### updateSync<sup>12+</sup>
3094
3095updateSync(data: DataBlob): DataBlob
3096
3097分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。
3098
3099必须在对[Cipher](#cipher)实例使用[initSync()](#initsync12)初始化后,才能使用本函数。
3100
3101其他注意事项同上异步接口说明。
3102
3103**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3104
3105**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3106
3107**参数:**
3108
3109| 参数名 | 类型                  | 必填 | 说明                                                         |
3110| ------ | --------------------- | ---- | ------------------------------------------------------------ |
3111| data   | [DataBlob](#datablob) | 是   | 加密或者解密的数据。data不能为null。 |
3112
3113**错误码:**
3114以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3115
3116| 错误码ID | 错误信息                |
3117| -------- | ----------------------- |
3118| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3119| 17620001 | memory error.           |
3120| 17620002 | runtime error.          |
3121| 17630001 | crypto operation error. |
3122
3123### doFinal
3124
3125doFinal(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void
3126
3127(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过注册回调函数获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用[update](#update-4)传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别:
3128
3129- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
3130- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。
3131
3132(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。
3133
3134> **说明:**
3135>
3136>  1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用init()并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。
3137>  2. 如果遇到解密失败,需检查加解密数据和init时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。
3138>  3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。
3139>  4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。
3140
3141**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3142
3143**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3144
3145API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
3146
3147**参数:**
3148
3149| 参数名     | 类型                                  | 必填 | 说明                                                         |
3150| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
3151| data     | [DataBlob](#datablob) \| null<sup>10+</sup>                 | 是   | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。API 10之前只支持DataBlob, API 10之后增加支持null。       |
3152| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。当最终加/解密数据成功,err为undefined,data为剩余数据的加/解密结果DataBlob;否则为错误对象。 |
3153
3154**错误码:**
3155以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3156
3157| 错误码ID | 错误信息                |
3158| -------- | ----------------------- |
3159| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3160| 17620001 | memory error.           |
3161| 17620002 | runtime error.          |
3162| 17630001 | crypto operation error. |
3163
3164**以AES GCM模式加密为例:**
3165
3166此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。
3167
3168```ts
3169import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3170import { buffer } from '@kit.ArkTS';
3171
3172function generateRandom(len: number) {
3173  let rand = cryptoFramework.createRandom();
3174  let generateRandSync = rand.generateRandomSync(len);
3175  return generateRandSync;
3176}
3177
3178function genGcmParamsSpec() {
3179  let ivBlob = generateRandom(12);
3180  let arr = [1, 2, 3, 4, 5, 6, 7, 8];
3181  let dataAad = new Uint8Array(arr);
3182  let aadBlob: cryptoFramework.DataBlob = { data: dataAad };
3183  arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
3184  let dataTag = new Uint8Array(arr);
3185  let tagBlob: cryptoFramework.DataBlob = {
3186    data: dataTag
3187  };
3188  let gcmParamsSpec: cryptoFramework.GcmParamsSpec = {
3189    iv: ivBlob,
3190    aad: aadBlob,
3191    authTag: tagBlob,
3192    algName: "GcmParamsSpec"
3193  };
3194  return gcmParamsSpec;
3195}
3196
3197function cipherByCallback() {
3198  let gcmParams = genGcmParamsSpec();
3199  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
3200  let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7');
3201  symKeyGenerator.generateSymKey((err, symKey) => {
3202    cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams, (err,) => {
3203      let message = "This is a test";
3204      let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
3205      cipher.update(plainText, (err, encryptUpdate) => {
3206        cipher.doFinal(null, (err, tag) => {
3207          gcmParams.authTag = tag;
3208          console.info('encryptUpdate plainText:' + encryptUpdate.data);
3209        });
3210      });
3211    });
3212  });
3213}
3214```
3215
3216### doFinal
3217
3218doFinal(data: DataBlob | null): Promise\<DataBlob>
3219
3220(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过Promise获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用update传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别:
3221
3222- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
3223- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。
3224
3225(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过Promise获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。
3226
3227> **说明:**
3228>
3229>  1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用init()并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。
3230>  2. 如果遇到解密失败,需检查加解密数据和init时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。
3231>  3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。
3232>  4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。
3233
3234**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3235
3236**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3237
3238API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
3239
3240**参数:**
3241
3242| 参数名 | 类型                  | 必填 | 说明                 |
3243| ---- | --------------------- | ---- | -------------------- |
3244| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是   | 加密或者解密的数据。data参数允许为null,但不允许传入{data: Uint8Array(空) }。API 10之前只支持DataBlob, API 10之后增加支持null。 |
3245
3246**返回值:**
3247
3248| 类型                            | 说明                                             |
3249| ------------------------------- | ------------------------------------------------ |
3250| Promise\<[DataBlob](#datablob)> | Promise对象,返回剩余数据的加/解密结果DataBlob。 |
3251
3252**错误码:**
3253以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3254
3255| 错误码ID | 错误信息                                     |
3256| -------- | -------------------------------------------- |
3257| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3258| 17620001 | memory error.                                |
3259| 17620002 | runtime error.                               |
3260| 17630001 | crypto operation error.                      |
3261
3262**以AES GCM模式加密为例:**
3263
3264此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。
3265
3266```ts
3267import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3268import { buffer } from '@kit.ArkTS';
3269
3270function generateRandom(len: number) {
3271  let rand = cryptoFramework.createRandom();
3272  let generateRandSync = rand.generateRandomSync(len);
3273  return generateRandSync;
3274}
3275
3276function genGcmParamsSpec() {
3277  let ivBlob = generateRandom(12);
3278  let arr = [1, 2, 3, 4, 5, 6, 7, 8];
3279  let dataAad = new Uint8Array(arr);
3280  let aadBlob: cryptoFramework.DataBlob = { data: dataAad };
3281  arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
3282  let dataTag = new Uint8Array(arr);
3283  let tagBlob: cryptoFramework.DataBlob = {
3284    data: dataTag
3285  };
3286  let gcmParamsSpec: cryptoFramework.GcmParamsSpec = {
3287    iv: ivBlob,
3288    aad: aadBlob,
3289    authTag: tagBlob,
3290    algName: "GcmParamsSpec"
3291  };
3292  return gcmParamsSpec;
3293}
3294
3295async function cipherByPromise() {
3296  let gcmParams = genGcmParamsSpec();
3297  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
3298  let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7');
3299  let symKey = await symKeyGenerator.generateSymKey();
3300  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams);
3301  let message = "This is a test";
3302  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
3303  let encryptUpdate = await cipher.update(plainText);
3304  gcmParams.authTag = await cipher.doFinal(null);
3305  console.info('encryptUpdate plainText: ' + encryptUpdate.data);
3306}
3307```
3308
3309### doFinalSync<sup>12+</sup>
3310
3311doFinalSync(data: DataBlob | null): DataBlob
3312
3313(1)在对称加解密中,doFinalSync加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过注册回调函数获取加密或者解密数据。<br/>如果数据量较小,可以在doFinalSync中一次性传入数据,而不使用updateSync;如果在本次加解密流程中,已经使用[updateSync](#updatesync12)传入过数据,可以在doFinalSync的data参数处传入null。<br/>根据对称加解密的模式不同,doFinalSync的输出有如下区别:
3314
3315- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次updateSync和doFinalSync的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinalSync的data参数传入null,则doFinalSync的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
3316- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次updateSync和doFinalSync的结果拼接起来,得到完整的明文/密文。
3317
3318(2)在RSA、SM2非对称加解密中,doFinalSync加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinalSync,拼接结果得到完整的明文/密文。
3319
3320其他注意事项同接口[doFinal()](#dofinal)说明。
3321
3322**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3323
3324**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3325
3326**参数:**
3327
3328| 参数名 | 类型                                        | 必填 | 说明                                                         |
3329| ------ | ------------------------------------------- | ---- | ------------------------------------------------------------ |
3330| data   | [DataBlob](#datablob)  | 是   | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。 |
3331
3332**错误码:**
3333以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3334
3335| 错误码ID | 错误信息                |
3336| -------- | ----------------------- |
3337| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3338| 17620001 | memory error.           |
3339| 17620002 | runtime error.          |
3340| 17630001 | crypto operation error. |
3341
3342**以AES GCM模式加密为例:**
3343
3344此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。
3345
3346```ts
3347import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3348import { buffer } from '@kit.ArkTS';
3349
3350function generateRandom(len: number) {
3351  let rand = cryptoFramework.createRandom();
3352  let generateRandSync = rand.generateRandomSync(len);
3353  return generateRandSync;
3354}
3355
3356function genGcmParamsSpec() {
3357  let ivBlob = generateRandom(12);
3358  let arr = [1, 2, 3, 4, 5, 6, 7, 8];
3359  let dataAad = new Uint8Array(arr);
3360  let aadBlob: cryptoFramework.DataBlob = { data: dataAad };
3361  arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
3362  let dataTag = new Uint8Array(arr);
3363  let tagBlob: cryptoFramework.DataBlob = {
3364    data: dataTag
3365  };
3366  let gcmParamsSpec: cryptoFramework.GcmParamsSpec = {
3367    iv: ivBlob,
3368    aad: aadBlob,
3369    authTag: tagBlob,
3370    algName: "GcmParamsSpec"
3371  };
3372  return gcmParamsSpec;
3373}
3374
3375async function cipherBySync() {
3376  let gcmParams = genGcmParamsSpec();
3377  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
3378  let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7');
3379  let symKey = await symKeyGenerator.generateSymKey();
3380  await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams);
3381  let message = "This is a test";
3382  let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) };
3383  let encryptUpdate = cipher.updateSync(plainText);
3384  gcmParams.authTag = cipher.doFinalSync(null);
3385  console.info('encryptUpdate plainText: ' + encryptUpdate.data);
3386}
3387
3388```
3389
3390### setCipherSpec<sup>10+</sup>
3391
3392setCipherSpec(itemType: CipherSpecItem, itemValue: Uint8Array): void
3393
3394设置加解密参数。常用的加解密参数可以直接通过[createCipher](#cryptoframeworkcreatecipher) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。
3395
3396**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3397
3398**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3399
3400API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
3401
3402**参数:**
3403
3404| 参数名   | 类型                 | 必填 | 说明       |
3405| -------- | -------------------- | ---- | ---------- |
3406| itemType     | [CipherSpecItem](#cipherspecitem10)           | 是   | 用于指定需要设置的加解密参数。 |
3407| itemValue | Uint8Array | 是   | 用于指定加解密参数的具体值。 |
3408
3409**错误码:**
3410以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3411
3412| 错误码ID | 错误信息               |
3413| -------- | ---------------------- |
3414| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3415| 801 | this operation is not supported.          |
3416| 17620001 | memory error.          |
3417| 17630001 | crypto operation error. |
3418
3419**示例:**
3420
3421<!--code_no_check-->
3422```ts
3423let cipher: cryptoFramework.Cipher; // The process of generating the Cipher instance is omitted here.
3424let pSource = new Uint8Array([1,2,3,4]);
3425cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource);
3426```
3427
3428### getCipherSpec<sup>10+</sup>
3429
3430getCipherSpec(itemType: CipherSpecItem): string | Uint8Array
3431
3432获取加解密参数。当前只支持RSA算法和SM2算法,从API version 11开始,支持SM2算法获取加解密参数。
3433
3434**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3435
3436**系统能力:** SystemCapability.Security.CryptoFramework.Cipher
3437
3438API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher
3439
3440**参数:**
3441
3442| 参数名 | 类型     | 必填 | 说明       |
3443| ------ | -------- | ---- | ---------- |
3444| itemType   | [CipherSpecItem](#cipherspecitem10) | 是   | 用于指定需要获取的加解密参数。 |
3445
3446**返回值:**
3447
3448| 类型           | 说明        |
3449| -------------- | ----------- |
3450| string \| Uint8Array | 获取的加解密参数的具体值。 |
3451
3452**错误码:**
3453以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3454
3455| 错误码ID | 错误信息               |
3456| -------- | ---------------------- |
3457| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3458| 801 | this operation is not supported.          |
3459| 17620001 | memory error.          |
3460| 17630001 | crypto operation error. |
3461
3462**示例:**
3463
3464<!--code_no_check-->
3465```ts
3466let cipher: cryptoFramework.Cipher; // The process of generating the Cipher instance is omitted here.
3467let mdName = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR);
3468```
3469
3470## cryptoFramework.createSign
3471
3472createSign(algName: string): Sign
3473
3474Sign实例生成。
3475
3476支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。
3477
3478**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3479
3480**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3481
3482API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3483
3484**参数:**
3485
3486| 参数名  | 类型   | 必填 | 说明                                                         |
3487| ------- | ------ | ---- | ------------------------------------------------------------ |
3488| algName | string | 是   | 指定签名算法:RSA,ECC,DSA,SM2<sup>10+</sup>或ED25519<sup>11+</sup>。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。<br/>使用RSA算法签名时,通过设置OnlySign参数可支持传入数据摘要仅作签名。 |
3489
3490**返回值**:
3491
3492| 类型 | 说明                               |
3493| ---- | ---------------------------------- |
3494| Sign | 返回由输入算法指定生成的Sign对象。 |
3495
3496**错误码:**
3497以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3498
3499| 错误码ID | 错误信息               |
3500| -------- | ---------------------- |
3501| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3502| 801 | this operation is not supported.          |
3503| 17620001 | memory error.          |
3504
3505**示例:**
3506
3507```ts
3508import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3509
3510let signer1 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256');
3511
3512let signer2 = cryptoFramework.createSign('RSA1024|PSS|SHA256|MGF1_SHA256');
3513
3514let signer3 = cryptoFramework.createSign('ECC224|SHA256');
3515
3516let signer4 = cryptoFramework.createSign('DSA2048|SHA256');
3517
3518let signer5 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256|OnlySign');
3519```
3520
3521## Sign
3522
3523Sign类,使用Sign方法之前需要创建该类的实例进行操作,通过[createSign(algName: string): Sign](#cryptoframeworkcreatesign)方法构造此实例。按序调用本类中的init、update、sign方法完成签名操作。签名操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
3524
3525Sign类不支持重复初始化,当业务方需要使用新密钥签名时,需要重新创建新Sign对象并调用init初始化。
3526
3527业务方使用时,在createSign时确定签名的模式,调用init接口设置密钥。
3528
3529当待签名数据较短时,可在init初始化后,(无需update)直接调用sign接口传入原文数据进行签名。
3530
3531当待签名数据较长时,可通过update接口分段传入切分后的原文数据,最后调用sign接口对整体原文数据进行签名。
3532
3533当使用update分段传入原文时,sign接口API 10之前只支持传入DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用sign进行签名。
3534
3535当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
3536
3537### 属性
3538
3539**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3540
3541**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3542
3543API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3544
3545| 名称    | 类型   | 可读 | 可写 | 说明                         |
3546| ------- | ------ | ---- | ---- | ---------------------------- |
3547| algName | string | 是   | 否   | 签名指定的算法名称。 |
3548
3549### init
3550
3551init(priKey: PriKey, callback: AsyncCallback\<void>): void
3552
3553使用私钥初始化Sign对象,通过注册回调函数获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。
3554
3555Sign类暂不支持重复init。
3556
3557**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3558
3559**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3560
3561API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3562
3563**参数:**
3564
3565| 参数名   | 类型                 | 必填 | 说明             |
3566| -------- | -------------------- | ---- | ---------------- |
3567| priKey   | [PriKey](#prikey)    | 是   | 用于Sign的初始化。 |
3568| callback | AsyncCallback\<void> | 是   | 回调函数。当签名初始化成功,err为undefined,否则为错误对象。 |
3569
3570**错误码:**
3571以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3572
3573| 错误码ID | 错误信息               |
3574| -------- | ---------------------- |
3575| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3576| 17620001 | memory error.          |
3577| 17620002 | runtime error.          |
3578| 17630001 | crypto operation error. |
3579
3580### init
3581
3582init(priKey: PriKey): Promise\<void>
3583
3584使用私钥初始化Sign对象,通过Promise获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。
3585
3586Sign类暂不支持重复init。
3587
3588**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3589
3590**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3591
3592API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3593
3594**参数:**
3595
3596| 参数名 | 类型 | 必填 | 说明             |
3597| ------ | ---- | ---- | ---------------- |
3598| priKey | [PriKey](#prikey)  | 是   | 用于Sign的初始化。 |
3599
3600**返回值:**
3601
3602| 类型           | 说明          |
3603| -------------- | ------------- |
3604| Promise\<void> | 无返回结果的Promise对象。 |
3605
3606**错误码:**
3607以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3608
3609| 错误码ID | 错误信息               |
3610| -------- | ---------------------- |
3611| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3612| 17620001 | memory error.          |
3613| 17620002 | runtime error.          |
3614| 17630001 | crypto operation error. |
3615
3616### initSync<sup>12+</sup>
3617
3618initSync(priKey: PriKey): void
3619
3620使用私钥初始化Sign对象,通过同步方式获取结果。initSync、updateSync、signSync为三段式接口,需要成组使用。其中initSync和signSync必选,updateSync可选。
3621
3622Sign类暂不支持重复initSync。
3623
3624**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3625
3626**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3627
3628**参数:**
3629
3630| 参数名 | 类型 | 必填 | 说明             |
3631| ------ | ---- | ---- | ---------------- |
3632| priKey | [PriKey](#prikey)  | 是   | 用于Sign的初始化。 |
3633
3634**错误码:**
3635以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3636
3637| 错误码ID | 错误信息               |
3638| -------- | ---------------------- |
3639| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3640| 17620001 | memory error.          |
3641| 17620002 | runtime error.          |
3642| 17630001 | crypto operation error. |
3643
3644### update
3645
3646update(data: DataBlob, callback: AsyncCallback\<void>): void
3647
3648追加待签名数据,通过注册回调函数完成更新。
3649
3650必须在对[Sign](#sign)实例使用[init()](#init-2)初始化后,才能使用本函数。
3651
3652> **说明:**
3653>
3654> 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[sign](#sign-1))或多次调用update。<br/>
3655> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
3656> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
3657> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/>
3658> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
3659
3660**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3661
3662**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3663
3664API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3665
3666**参数:**
3667
3668| 参数名   | 类型                  | 必填 | 说明         |
3669| -------- | --------------------- | ---- | ------------ |
3670| data     | [DataBlob](#datablob) | 是   | 传入的消息。 |
3671| callback | AsyncCallback\<void>  | 是   | 回调函数。当签名更新成功,err为undefined,否则为错误对象。|
3672
3673**错误码:**
3674以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3675
3676| 错误码ID | 错误信息               |
3677| -------- | ---------------------- |
3678| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3679| 17620001 | memory error.          |
3680| 17620002 | runtime error.          |
3681| 17630001 | crypto operation error. |
3682
3683### update
3684
3685update(data: DataBlob): Promise\<void>
3686
3687追加待签名数据,通过Promise方式完成更新。
3688
3689必须在对[Sign](#sign)实例使用[init()](#init-3)初始化后,才能使用本函数。
3690
3691> **说明:**
3692>
3693> 根据数据量,可以不调用update(即[init](#init-3)完成后直接调用[sign](#sign-2))或多次调用update。<br/>
3694> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
3695> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
3696> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/>
3697> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
3698
3699**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3700
3701**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3702
3703API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3704
3705**参数:**
3706
3707| 参数名 | 类型     | 必填 | 说明       |
3708| ------ | -------- | ---- | ---------- |
3709| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |
3710
3711**返回值:**
3712
3713| 类型           | 说明          |
3714| -------------- | ------------- |
3715| Promise\<void> | 无返回结果的Promise对象。 |
3716
3717**错误码:**
3718以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3719
3720| 错误码ID | 错误信息               |
3721| -------- | ---------------------- |
3722| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3723| 17620001 | memory error.          |
3724| 17620002 | runtime error.          |
3725| 17630001 | crypto operation error. |
3726
3727### updateSync<sup>12+</sup>
3728
3729updateSync(data: DataBlob): void
3730
3731追加待签名数据,通过同步方式完成更新。
3732
3733必须在对[Sign](#sign)实例使用[initSync()](#initsync12-1)初始化后,才能使用本函数。
3734
3735> **说明:**
3736>
3737> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-1)完成后直接调用[signSync](#signsync12))或多次调用updateSync。<br/>
3738> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/>
3739> 签名使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
3740> OnlySign模式下,不支持updateSync操作,需要直接使用signSync传入数据。<br/>
3741> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。
3742
3743**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3744
3745**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3746
3747**参数:**
3748
3749| 参数名 | 类型     | 必填 | 说明       |
3750| ------ | -------- | ---- | ---------- |
3751| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |
3752
3753**返回值:**
3754
3755| 类型           | 说明          |
3756| -------------- | ------------- |
3757| void | 无返回结果。 |
3758
3759**错误码:**
3760以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3761
3762| 错误码ID | 错误信息               |
3763| -------- | ---------------------- |
3764| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3765| 17620001 | memory error.          |
3766| 17620002 | runtime error.          |
3767| 17630001 | crypto operation error. |
3768
3769### sign
3770
3771sign(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void
3772
3773对数据进行签名,通过注册回调函数获取签名结果。
3774
3775**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3776
3777**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3778
3779API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3780
3781**参数:**
3782
3783| 参数名   | 类型                 | 必填 | 说明       |
3784| -------- | -------------------- | ---- | ---------- |
3785| data     | [DataBlob](#datablob) \| null<sup>10+</sup>              | 是   | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 |
3786| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取DataBlob数据。 |
3787
3788**错误码:**
3789以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3790
3791| 错误码ID | 错误信息               |
3792| -------- | ---------------------- |
3793| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3794| 17620001 | memory error.          |
3795| 17620002 | runtime error.          |
3796| 17630001 | crypto operation error. |
3797
3798### sign
3799
3800sign(data: DataBlob | null): Promise\<DataBlob>
3801
3802对数据进行签名,通过Promise方式返回签名结果。
3803
3804**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3805
3806**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3807
3808API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3809
3810**参数:**
3811
3812| 参数名 | 类型     | 必填 | 说明       |
3813| ------ | -------- | ---- | ---------- |
3814| data   | [DataBlob](#datablob) \| null<sup>10+</sup>  | 是   | 传入的消息。 |
3815
3816**返回值:**
3817
3818| 类型           | 说明          |
3819| -------------- | ------------- |
3820| Promise\<[DataBlob](#datablob)> | 返回签名结果。 |
3821
3822**错误码:**
3823以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3824
3825| 错误码ID | 错误信息               |
3826| -------- | ---------------------- |
3827| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3828| 17620001 | memory error.          |
3829| 17620002 | runtime error.          |
3830| 17630001 | crypto operation error. |
3831
3832### signSync<sup>12+</sup>
3833
3834signSync(data: DataBlob | null): DataBlob
3835
3836对数据进行签名,通过同步方式返回签名结果。
3837
3838**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3839
3840**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3841
3842**参数:**
3843
3844| 参数名 | 类型     | 必填 | 说明       |
3845| ------ | -------- | ---- | ---------- |
3846| data   | [DataBlob](#datablob) \| null  | 是   | 传入的消息。 |
3847
3848**返回值:**
3849
3850| 类型           | 说明          |
3851| -------------- | ------------- |
3852| [DataBlob](#datablob) | 返回签名结果。 |
3853
3854**错误码:**
3855以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3856
3857| 错误码ID | 错误信息               |
3858| -------- | ---------------------- |
3859| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3860| 17620001 | memory error.          |
3861| 17620002 | runtime error.          |
3862| 17630001 | crypto operation error. |
3863
3864**callback示例:**
3865
3866此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
3867
3868```ts
3869import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3870import { buffer } from '@kit.ArkTS';
3871
3872function signByCallback() {
3873  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
3874  let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
3875  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]);
3876  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]);
3877  let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData };
3878  let priKeyBlob: cryptoFramework.DataBlob = { data: skData };
3879  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
3880  let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256');
3881  rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => {
3882    signer.init(keyPair.priKey, err => {
3883      signer.update(inputUpdate, err => {
3884        signer.sign(inputVerify, (err, signData) => {
3885          console.info('sign output is ' + signData.data);
3886        });
3887      });
3888    });
3889  });
3890}
3891```
3892
3893**Promise示例:**
3894
3895此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
3896
3897```ts
3898import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3899import { buffer } from '@kit.ArkTS';
3900
3901async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
3902  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
3903  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
3904  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
3905  let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob);
3906  console.info('convertKey success');
3907  return keyPair;
3908}
3909
3910async function signByPromise() {
3911  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]);
3912  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]);
3913  let keyPair = await genKeyPairByData(pkData, skData);
3914  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
3915  let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
3916  let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256');
3917  await signer.init(keyPair.priKey);
3918  await signer.update(inputUpdate);
3919  let signData = await signer.sign(inputSign);
3920  console.info('signData result: ' + signData.data);
3921}
3922```
3923
3924**Sync示例:**
3925
3926此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
3927
3928```ts
3929import { cryptoFramework } from '@kit.CryptoArchitectureKit';
3930import { buffer } from '@kit.ArkTS';
3931
3932function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
3933  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
3934  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
3935  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
3936  let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob);
3937  console.info('convertKeySync success');
3938  return keyPair;
3939}
3940
3941function signBySync() {
3942  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]);
3943  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]);
3944  let keyPair =  genKeyPairByData(pkData, skData);
3945  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
3946  let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
3947  let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256');
3948  signer.initSync(keyPair.priKey);
3949  signer.updateSync(inputUpdate);
3950  let signData = signer.signSync(inputSign);
3951  console.info('signData result: ' + signData.data);
3952}
3953```
3954
3955### setSignSpec<sup>10+</sup>
3956
3957setSignSpec(itemType: SignSpecItem, itemValue: number): void
3958
3959setSignSpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void
3960
3961设置签名参数。常用的签名参数可以直接通过[createSign](#cryptoframeworkcreatesign) 来指定,剩余参数可以通过本接口指定。
3962
3963只支持RSA算法、SM2算法,从API version11开始,支持SM2算法设置签名参数。
3964
3965**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
3966
3967**系统能力:** SystemCapability.Security.CryptoFramework.Signature
3968
3969API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
3970
3971**参数:**
3972
3973| 参数名   | 类型                 | 必填 | 说明       |
3974| -------- | -------------------- | ---- | ---------- |
3975| itemType     | [SignSpecItem](#signspecitem10)              | 是   | 用于指定需要设置的签名参数。 |
3976| itemValue | number \| Uint8Array<sup>11+</sup> | 是   | 用于指定签名参数的具体值。 |
3977
3978**错误码:**
3979以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
3980
3981| 错误码ID | 错误信息               |
3982| -------- | ---------------------- |
3983| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
3984| 801 | this operation is not supported.          |
3985| 17620001 | memory error.          |
3986| 17630001 | crypto operation error. |
3987
3988**示例:**
3989
3990<!--code_no_check-->
3991```ts
3992let signer: cryptoFramework.Sign; // The process of generating the Sign instance is omitted here.
3993let setN = 20;
3994signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN);
3995```
3996
3997### getSignSpec<sup>10+</sup>
3998
3999getSignSpec(itemType: SignSpecItem): string | number
4000
4001获取签名参数。当前只支持RSA算法。
4002
4003**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4004
4005**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4006
4007API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4008
4009**参数:**
4010
4011| 参数名 | 类型     | 必填 | 说明       |
4012| ------ | -------- | ---- | ---------- |
4013| itemType | [SignSpecItem](#signspecitem10)  | 是   | 用于指定需要获取的签名参数。 |
4014
4015**返回值:**
4016
4017| 类型           | 说明        |
4018| -------------- | ----------- |
4019| string \| number | 获取的签名参数的具体值。 |
4020
4021**错误码:**
4022以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4023
4024| 错误码ID | 错误信息               |
4025| -------- | ---------------------- |
4026| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4027| 801 | this operation is not supported.          |
4028| 17620001 | memory error.          |
4029| 17630001 | crypto operation error. |
4030
4031**示例:**
4032
4033<!--code_no_check-->
4034```ts
4035let signer: cryptoFramework.Sign; // The process of generating the Sign instance is omitted here.
4036let saltLen = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM);
4037```
4038
4039## cryptoFramework.createVerify
4040
4041createVerify(algName: string): Verify
4042
4043Verify实例生成。
4044
4045支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。
4046
4047**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4048
4049**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4050
4051API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4052
4053**参数:**
4054
4055| 参数名  | 类型   | 必填 | 说明                                                         |
4056| ------- | ------ | ---- | ------------------------------------------------------------ |
4057| algName | string | 是   | 指定签名算法:RSA,ECC,DSA,SM2<sup>10+</sup>或ED25519<sup>11+</sup>。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。<br/>使用RSA算法验签时,通过设置Recover参数可支持对签名后数据进行验签恢复。 |
4058
4059**返回值**:
4060
4061| 类型   | 说明                                 |
4062| ------ | ------------------------------------ |
4063| Verify | 返回由输入算法指定生成的Verify对象。 |
4064
4065**错误码:**
4066以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4067
4068| 错误码ID | 错误信息               |
4069| -------- | ---------------------- |
4070| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4071| 801 | this operation is not supported.          |
4072| 17620001 | memory error.          |
4073
4074**示例:**
4075
4076```ts
4077import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4078
4079let verifyer1 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256');
4080
4081let verifyer2 = cryptoFramework.createVerify('RSA1024|PSS|SHA256|MGF1_SHA256');
4082
4083let verifyer3 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover');
4084```
4085
4086## Verify
4087
4088Verify类,使用Verify方法之前需要创建该类的实例进行操作,通过[createVerify(algName: string): Verify](#cryptoframeworkcreateverify)方法构造此实例。按序调用本类中的init、update、verify方法完成签名操作。验签操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4089
4090Verify类不支持重复初始化,当业务方需要使用新密钥验签时,需要重新创建新Verify对象并调用init初始化。
4091
4092业务方使用时,在createVerify时确定验签的模式,调用init接口设置密钥。
4093
4094当被签名的消息较短时,可在init初始化后,(无需update)直接调用verify接口传入被签名的消息和签名(signatureData)进行验签。
4095
4096当被签名的消息较长时,可通过update接口分段传入被签名的消息,最后调用verify接口对消息全文进行验签。verify接口的data入参在API 10之前只支持DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用verify传入签名(signatureData)进行验签。
4097
4098当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
4099
4100### 属性
4101
4102**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4103
4104**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4105
4106API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4107
4108| 名称    | 类型   | 可读 | 可写 | 说明                         |
4109| ------- | ------ | ---- | ---- | ---------------------------- |
4110| algName | string | 是   | 否   | 验签指定的算法名称。 |
4111
4112### init
4113
4114init(pubKey: PubKey, callback: AsyncCallback\<void>): void
4115
4116传入公钥初始化Verify对象,通过注册回调函数获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。
4117
4118**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4119
4120**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4121
4122API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4123
4124**参数:**
4125
4126| 参数名   | 类型                 | 必填 | 说明                           |
4127| -------- | -------------------- | ---- | ------------------------------ |
4128| pubKey   | [PubKey](#pubkey)    | 是   | 公钥对象,用于Verify的初始化。 |
4129| callback | AsyncCallback\<void> | 是   | 回调函数。当验签初始化成功,err为undefined,否则为错误对象。  |
4130
4131**错误码:**
4132以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4133
4134| 错误码ID | 错误信息               |
4135| -------- | ---------------------- |
4136| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4137| 17620001 | memory error.          |
4138| 17620002 | runtime error.          |
4139| 17630001 | crypto operation error. |
4140
4141### init
4142
4143init(pubKey: PubKey): Promise\<void>
4144
4145传入公钥初始化Verify对象,通过Promise获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。
4146
4147**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4148
4149**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4150
4151API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4152
4153**参数:**
4154
4155| 参数名 | 类型 | 必填 | 说明                         |
4156| ------ | ---- | ---- | ---------------------------- |
4157| pubKey | [PubKey](#pubkey)  | 是   | 公钥对象,用于Verify的初始化。 |
4158
4159**返回值:**
4160
4161| 类型           | 说明          |
4162| -------------- | ------------- |
4163| Promise\<void> | 无返回结果的Promise对象。 |
4164
4165**错误码:**
4166以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4167
4168| 错误码ID | 错误信息               |
4169| -------- | ---------------------- |
4170| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4171| 17620001 | memory error.          |
4172| 17620002 | runtime error.          |
4173| 17630001 | crypto operation error. |
4174
4175### initSync<sup>12+</sup>
4176
4177initSync(pubKey: PubKey): void
4178
4179传入公钥初始化Verify对象,通过同步方式获取结果。initSync、updateSync、verifySync为三段式接口,需要成组使用。其中initSync和verifySync必选,updateSync可选。
4180
4181**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4182
4183**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4184
4185**参数:**
4186
4187| 参数名 | 类型 | 必填 | 说明                         |
4188| ------ | ---- | ---- | ---------------------------- |
4189| pubKey | [PubKey](#pubkey)  | 是   | 公钥对象,用于Verify的初始化。 |
4190
4191**返回值:**
4192
4193| 类型           | 说明          |
4194| -------------- | ------------- |
4195| void | 无返回结果。 |
4196
4197**错误码:**
4198以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4199
4200| 错误码ID | 错误信息               |
4201| -------- | ---------------------- |
4202| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4203| 17620001 | memory error.          |
4204| 17620002 | runtime error.          |
4205| 17630001 | crypto operation error. |
4206
4207### update
4208
4209update(data: DataBlob, callback: AsyncCallback\<void>): void
4210
4211追加待验签数据,通过注册回调函数完成更新。
4212
4213必须在对[Verify](#verify)实例使用[init()](#init-4)初始化后,才能使用本函数。
4214
4215> **说明:**
4216>
4217> 根据数据量,可以不调用update(即[init](#init-4)完成后直接调用[verify](#verify-1))或多次调用update。<br/>
4218> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
4219> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
4220> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
4221
4222**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4223
4224**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4225
4226API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4227
4228**参数:**
4229
4230| 参数名   | 类型                  | 必填 | 说明         |
4231| -------- | --------------------- | ---- | ------------ |
4232| data     | [DataBlob](#datablob) | 是   | 传入的消息。 |
4233| callback | AsyncCallback\<void>  | 是   | 回调函数。当验签更新成功,err为undefined,否则为错误对象。|
4234
4235**错误码:**
4236以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4237
4238| 错误码ID | 错误信息               |
4239| -------- | ---------------------- |
4240| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4241| 17620001 | memory error.          |
4242| 17620002 | runtime error.          |
4243| 17630001 | crypto operation error. |
4244
4245### update
4246
4247update(data: DataBlob): Promise\<void>
4248
4249追加待验签数据,通过Promise方式完成更新。
4250
4251必须在对[Verify](#verify)实例使用[init()](#init-5)初始化后,才能使用本函数。
4252
4253> **说明:**
4254>
4255> 根据数据量,可以不调用update(即[init](#init-5)完成后直接调用[verify](#verify-2))或多次调用update。<br/>
4256> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
4257> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
4258> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。
4259
4260**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4261
4262**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4263
4264API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4265
4266**参数:**
4267
4268| 参数名 | 类型     | 必填 | 说明       |
4269| ------ | -------- | ---- | ---------- |
4270| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |
4271
4272**返回值:**
4273
4274| 类型           | 说明          |
4275| -------------- | ------------- |
4276| Promise\<void> | 无返回结果的Promise对象。 |
4277
4278**错误码:**
4279以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4280
4281| 错误码ID | 错误信息               |
4282| -------- | ---------------------- |
4283| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4284| 17620001 | memory error.          |
4285| 17620002 | runtime error.          |
4286| 17630001 | crypto operation error. |
4287
4288### updateSync<sup>12+</sup>
4289
4290updateSync(data: DataBlob): void
4291
4292追加待验签数据,通过同步方式完成更新。
4293
4294必须在对[Verify](#verify)实例使用[initSync()](#initsync12-2)初始化后,才能使用本函数。
4295
4296> **说明:**
4297>
4298> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-2)完成后直接调用[verifySync](#verifysync12))或多次调用updateSync。<br/>
4299> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/>
4300> 验签使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/>
4301> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。
4302
4303**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4304
4305**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4306
4307**参数:**
4308
4309| 参数名 | 类型     | 必填 | 说明       |
4310| ------ | -------- | ---- | ---------- |
4311| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |
4312
4313**返回值:**
4314
4315| 类型           | 说明          |
4316| -------------- | ------------- |
4317| void | 无返回结果。 |
4318
4319**错误码:**
4320以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4321
4322| 错误码ID | 错误信息               |
4323| -------- | ---------------------- |
4324| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4325| 17620001 | memory error.          |
4326| 17620002 | runtime error.          |
4327| 17630001 | crypto operation error. |
4328
4329### verify
4330
4331verify(data: DataBlob | null, signatureData: DataBlob, callback: AsyncCallback\<boolean>): void
4332
4333对数据进行验签,通过注册回调函数返回返回验签结果。
4334
4335**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4336
4337**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4338
4339API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4340
4341**参数:**
4342
4343| 参数名        | 类型                 | 必填 | 说明       |
4344| ------------- | -------------------- | ---- | ---------- |
4345| data          | [DataBlob](#datablob) \| null<sup>10+</sup>             | 是   | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 |
4346| signatureData | [DataBlob](#datablob)              | 是   | 签名数据。  |
4347| callback      | AsyncCallback\<boolean> | 是   | 回调函数,用于获取以boolean值表示的验签结果。 |
4348
4349**错误码:**
4350以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4351
4352| 错误码ID | 错误信息               |
4353| -------- | ---------------------- |
4354| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4355| 17620001 | memory error.          |
4356| 17620002 | runtime error.          |
4357| 17630001 | crypto operation error. |
4358
4359### verify
4360
4361verify(data: DataBlob | null, signatureData: DataBlob): Promise\<boolean>
4362
4363对数据进行验签,通过Promise返回验签结果。
4364
4365**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4366
4367**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4368
4369API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4370
4371**参数:**
4372
4373| 参数名        | 类型     | 必填 | 说明       |
4374| ------------- | -------- | ---- | ---------- |
4375| data          | [DataBlob](#datablob) \| null<sup>10+</sup>  | 是   | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 |
4376| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |
4377
4378**返回值:**
4379
4380| 类型              | 说明                           |
4381| ----------------- | ------------------------------ |
4382| Promise\<boolean> | 异步返回值,代表验签是否通过。 |
4383
4384**错误码:**
4385以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4386
4387| 错误码ID | 错误信息               |
4388| -------- | ---------------------- |
4389| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4390| 17620001 | memory error.          |
4391| 17620002 | runtime error.          |
4392| 17630001 | crypto operation error. |
4393
4394### verifySync<sup>12+</sup>
4395
4396verifySync(data: DataBlob | null, signatureData: DataBlob): boolean
4397
4398对数据进行验签,通过同步方式返回验签结果。
4399
4400**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4401
4402**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4403
4404**参数:**
4405
4406| 参数名        | 类型     | 必填 | 说明       |
4407| ------------- | -------- | ---- | ---------- |
4408| data          | [DataBlob](#datablob) \| null  | 是   | 传入的消息。 |
4409| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |
4410
4411**返回值:**
4412
4413| 类型              | 说明                           |
4414| ----------------- | ------------------------------ |
4415| boolean | 同步返回值,代表验签是否通过。 |
4416
4417**错误码:**
4418以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4419
4420| 错误码ID | 错误信息               |
4421| -------- | ---------------------- |
4422| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4423| 17620001 | memory error.          |
4424| 17620002 | runtime error.          |
4425| 17630001 | crypto operation error. |
4426
4427**callback示例:**
4428
4429此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4430
4431```ts
4432import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4433import { buffer } from '@kit.ArkTS';
4434
4435function verifyByCallback() {
4436  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
4437  let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
4438  // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过
4439  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]);
4440  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]);
4441  let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData };
4442  let priKeyBlob: cryptoFramework.DataBlob = { data: skData };
4443  // 该数据取自Sign中的signData.data
4444  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]) }
4445  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
4446  let verifyer = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256');
4447  rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => {
4448    verifyer.init(keyPair.pubKey, err => {
4449      verifyer.update(inputUpdate, err => {
4450        verifyer.verify(inputVerify, signMessageBlob, (err, res) => {
4451          console.info('verify result is ' + res);
4452        });
4453      });
4454    });
4455  });
4456}
4457```
4458
4459**Promise示例:**
4460
4461此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4462
4463```ts
4464import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4465import { buffer } from '@kit.ArkTS';
4466
4467async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
4468  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
4469  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
4470  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
4471  let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob);
4472  console.info('convertKey success');
4473  return keyPair;
4474}
4475
4476async function verifyByPromise() {
4477  // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过
4478  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]);
4479  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]);
4480  let keyPair = await genKeyPairByData(pkData, skData);
4481  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
4482  let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
4483  // 该数据取自Sign中的signData.data
4484  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]) };
4485  let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256');
4486  await verifier.init(keyPair.pubKey);
4487  await verifier.update(inputUpdate);
4488  let res = await verifier.verify(inputVerify, signMessageBlob);
4489  console.info('verify result: ' + res);
4490}
4491```
4492
4493**Sync示例:**
4494
4495此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。
4496
4497```ts
4498import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4499import { buffer } from '@kit.ArkTS';
4500
4501function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
4502  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
4503  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
4504  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
4505  let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob);
4506  console.info('convertKey success');
4507  return keyPair;
4508}
4509
4510function verifyBySync() {
4511  // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过
4512  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]);
4513  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]);
4514  let keyPair = genKeyPairByData(pkData, skData);
4515  let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) };
4516  let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) };
4517  // 该数据取自Sign中的signData.data
4518  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]) };
4519  let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256');
4520  verifier.initSync(keyPair.pubKey);
4521  verifier.updateSync(inputUpdate);
4522  let res = verifier.verifySync(inputVerify, signMessageBlob);
4523  console.info('verify result: ' + res);
4524}
4525```
4526
4527### recover<sup>12+</sup>
4528
4529recover(signatureData: DataBlob): Promise\<DataBlob | null>
4530
4531对数据进行签名恢复原始数据,通过Promise返回恢复结果。
4532
4533> **说明:**
4534>
4535> - 目前仅RSA支持。
4536
4537**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4538
4539**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4540
4541**参数:**
4542
4543| 参数名        | 类型     | 必填 | 说明       |
4544| ------------- | -------- | ---- | ---------- |
4545| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |
4546
4547**返回值:**
4548
4549| 类型              | 说明                           |
4550| ----------------- | ------------------------------ |
4551| Promise\<[DataBlob](#datablob)  \| null> | 验签恢复的数据。 |
4552
4553**错误码:**
4554以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4555
4556| 错误码ID | 错误信息               |
4557| -------- | ---------------------- |
4558| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4559| 17620001 | memory error.          |
4560| 17620002 | runtime error.          |
4561| 17630001 | crypto operation error. |
4562
4563**示例:**
4564
4565```ts
4566import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4567import { buffer } from '@kit.ArkTS';
4568
4569async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) {
4570  let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData };
4571  let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData };
4572  let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
4573  let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob);
4574  console.info('convertKey success');
4575  return keyPair;
4576}
4577
4578async function recoverByPromise() {
4579  // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过
4580  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]);
4581  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]);
4582  let keyPair = await genKeyPairByData(pkData, skData);
4583  // 该数据取自Sign中的signData.data
4584  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]) };
4585  let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover');
4586  await verifier.init(keyPair.pubKey);
4587  try {
4588    let rawSignData = await verifier.recover(signMessageBlob);
4589    if (rawSignData != null) {
4590      console.info('[Promise]: recover result: ' + rawSignData.data);
4591    } else {
4592      console.error("[Promise]: get verify recover result fail!");
4593    }
4594  } catch (error) {
4595    let e: BusinessError = error as BusinessError;
4596    console.error(`promise error, ${e.code}, ${e.message}`);
4597  }
4598}
4599```
4600
4601### recoverSync<sup>12+</sup>
4602
4603recoverSync(signatureData: DataBlob): DataBlob | null
4604
4605对数据进行签名恢复原始数据。
4606
4607> **说明:**
4608>
4609> - 目前仅RSA支持。
4610
4611**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4612
4613**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4614
4615**参数:**
4616
4617| 参数名        | 类型     | 必填 | 说明       |
4618| ------------- | -------- | ---- | ---------- |
4619| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |
4620
4621**返回值:**
4622
4623| 类型              | 说明                           |
4624| ----------------- | ------------------------------ |
4625| [DataBlob](#datablob)  \| null | 验签恢复的数据。 |
4626
4627**错误码:**
4628以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4629
4630| 错误码ID | 错误信息               |
4631| -------- | ---------------------- |
4632| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4633| 17620001 | memory error.          |
4634| 17620002 | runtime error.          |
4635| 17630001 | crypto operation error. |
4636
4637### setVerifySpec<sup>10+</sup>
4638
4639setVerifySpec(itemType: SignSpecItem, itemValue: number): void
4640
4641setVerifySpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void
4642
4643设置验签参数。常用的签名参数可以直接通过[createVerify](#cryptoframeworkcreateverify) 来指定,剩余参数可以通过本接口指定。
4644
4645只支持RSA算法、SM2算法,从API version 11开始,支持SM2算法设置验签参数。
4646
4647验签的参数应当与签名的参数保持一致。
4648
4649**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4650
4651**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4652
4653API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4654
4655**参数:**
4656
4657| 参数名   | 类型                 | 必填 | 说明       |
4658| -------- | -------------------- | ---- | ---------- |
4659| itemType     | [SignSpecItem](#signspecitem10)              | 是   | 用于指定需要设置的验签参数。 |
4660| itemValue | number \| Uint8Array<sup>11+</sup> | 是   | 用于指定验签参数的具体值。 |
4661
4662**错误码:**
4663以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4664
4665| 错误码ID | 错误信息               |
4666| -------- | ---------------------- |
4667| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4668| 801 | this operation is not supported.          |
4669| 17620001 | memory error.          |
4670| 17630001 | crypto operation error. |
4671
4672**示例:**
4673
4674<!--code_no_check-->
4675```ts
4676let verifyer: cryptoFramework.Verify; // The process of generating the Verify instance is omitted here.
4677let setN = 20;
4678verifyer.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN);
4679```
4680
4681### getVerifySpec<sup>10+</sup>
4682
4683getVerifySpec(itemType: SignSpecItem): string | number
4684
4685获取验签参数。当前只支持RSA算法。
4686
4687验签的参数应当与签名的参数保持一致。
4688
4689**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4690
4691**系统能力:** SystemCapability.Security.CryptoFramework.Signature
4692
4693API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature
4694
4695**参数:**
4696
4697| 参数名 | 类型     | 必填 | 说明       |
4698| ------ | -------- | ---- | ---------- |
4699| itemType   | [SignSpecItem](#signspecitem10)  | 是   | 用于指定需要获取的验签参数。 |
4700
4701**返回值:**
4702
4703| 类型           | 说明        |
4704| -------------- | ----------- |
4705| string \| number | 获取的验签参数的具体值。 |
4706
4707**错误码:**
4708以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4709
4710| 错误码ID | 错误信息               |
4711| -------- | ---------------------- |
4712| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4713| 801 | this operation is not supported.          |
4714| 17620001 | memory error.          |
4715| 17630001 | crypto operation error. |
4716
4717**示例:**
4718
4719<!--code_no_check-->
4720```ts
4721let verifyer: cryptoFramework.Verify; // The process of generating the Verify instance is omitted here.
4722let saltLen = verifyer.getVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM);
4723```
4724
4725## cryptoFramework.createKeyAgreement
4726
4727createKeyAgreement(algName: string): KeyAgreement
4728
4729KeyAgreement实例生成。
4730
4731支持的规格详见[密钥协商规格](../../security/CryptoArchitectureKit/crypto-key-agreement-overview.md)。
4732
4733**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4734
4735**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
4736
4737API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement
4738
4739**参数:**
4740
4741| 参数名  | 类型   | 必填 | 说明                                                         |
4742| ------- | ------ | ---- | ------------------------------------------------------------ |
4743| algName | string | 是   | 指定密钥协商算法:目前仅支持ECC,从API version 11开始,增加支持X25519和DH。 |
4744
4745**返回值**:
4746
4747| 类型         | 说明                                       |
4748| ------------ | ------------------------------------------ |
4749| KeyAgreement | 返回由输入算法指定生成的KeyAgreement对象。 |
4750
4751**错误码:**
4752以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4753
4754| 错误码ID | 错误信息               |
4755| -------- | ---------------------- |
4756| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4757| 801 | this operation is not supported.          |
4758| 17620001 | memory error.          |
4759
4760**示例:**
4761
4762```ts
4763import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4764
4765let keyAgreement = cryptoFramework.createKeyAgreement('ECC256');
4766```
4767
4768## KeyAgreement
4769
4770KeyAgreement类,使用密钥协商方法之前需要创建该类的实例进行操作,通过[createKeyAgreement(algName: string): KeyAgreement](#cryptoframeworkcreatekeyagreement)方法构造此实例。
4771
4772### 属性
4773
4774**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4775
4776**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
4777
4778API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement
4779
4780| 名称    | 类型   | 可读 | 可写 | 说明                         |
4781| ------- | ------ | ---- | ---- | ---------------------------- |
4782| algName | string | 是   | 否   | 密钥协商指定的算法名称。 |
4783
4784### generateSecret
4785
4786generateSecret(priKey: PriKey, pubKey: PubKey, callback: AsyncCallback\<DataBlob>): void
4787
4788基于传入的私钥与公钥进行密钥协商,通过注册回调函数返回共享密钥。
4789
4790**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4791
4792**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
4793
4794API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement
4795
4796**参数:**
4797
4798| 参数名   | 类型                     | 必填 | 说明                   |
4799| -------- | ------------------------ | ---- | ---------------------- |
4800| priKey   | [PriKey](#prikey)        | 是   | 设置密钥协商的私钥输入。 |
4801| pubKey   | [PubKey](#pubkey)        | 是   | 设置密钥协商的公钥输入。 |
4802| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 异步接受共享密钥的回调。 |
4803
4804**错误码:**
4805以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4806
4807| 错误码ID | 错误信息               |
4808| -------- | ---------------------- |
4809| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4810| 17620001 | memory error.          |
4811| 17620002 | runtime error.          |
4812| 17630001 | crypto operation error. |
4813
4814### generateSecret
4815
4816generateSecret(priKey: PriKey, pubKey: PubKey): Promise\<DataBlob>
4817
4818基于传入的私钥与公钥进行密钥协商,通过Promise返回共享密钥。
4819
4820**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4821
4822**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
4823
4824API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement
4825
4826**参数:**
4827
4828| 参数名 | 类型   | 必填 | 说明                   |
4829| ------ | ------ | ---- | ---------------------- |
4830| priKey | [PriKey](#prikey) | 是   | 设置密钥协商的私钥输入。 |
4831| pubKey | [PubKey](#pubkey) | 是   | 设置密钥协商的公钥输入。 |
4832
4833**返回值:**
4834
4835| 类型               | 说明     |
4836| ------------------ | -------- |
4837| Promise\<[DataBlob](#datablob)> | 共享密钥。 |
4838
4839**错误码:**
4840以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4841
4842| 错误码ID | 错误信息               |
4843| -------- | ---------------------- |
4844| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4845| 17620001 | memory error.          |
4846| 17620002 | runtime error.          |
4847| 17630001 | crypto operation error. |
4848
4849### generateSecretSync<sup>12+</sup>
4850
4851generateSecretSync(priKey: PriKey, pubKey: PubKey): DataBlob
4852
4853基于传入的私钥与公钥进行密钥协商,通过同步返回共享密钥。
4854
4855**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4856
4857**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement
4858
4859**参数:**
4860
4861| 参数名 | 类型   | 必填 | 说明                   |
4862| ------ | ------ | ---- | ---------------------- |
4863| priKey | [PriKey](#prikey) | 是   | 设置密钥协商的私钥输入。 |
4864| pubKey | [PubKey](#pubkey) | 是   | 设置密钥协商的公钥输入。 |
4865
4866**返回值:**
4867
4868| 类型               | 说明     |
4869| ------------------ | -------- |
4870|[DataBlob](#datablob) | 共享密钥。 |
4871
4872**错误码:**
4873以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4874
4875| 错误码ID | 错误信息               |
4876| -------- | ---------------------- |
4877| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4878| 17620001 | memory error.          |
4879| 17620002 | runtime error.          |
4880| 17630001 | crypto operation error. |
4881
4882**callback示例:**
4883
4884<!--code_no_check-->
4885```ts
4886import { BusinessError } from '@kit.BasicServicesKit';
4887
4888let globalKeyPair: cryptoFramework.KeyPair; // globalKeyPair is an asymmetric key object generated by the asymmetric key generator. The generation process is omitted here.
4889let keyAgreement = cryptoFramework.createKeyAgreement('ECC256');
4890keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey, (err, secret) => {
4891  if (err) {
4892    console.error("keyAgreement error.");
4893    return;
4894  }
4895  console.info('keyAgreement output is ' + secret.data);
4896});
4897```
4898
4899**Promise示例:**
4900
4901<!--code_no_check-->
4902```ts
4903import { BusinessError } from '@kit.BasicServicesKit';
4904
4905let globalKeyPair: cryptoFramework.KeyPair; // globalKeyPair is an asymmetric key object generated by the asymmetric key generator. The generation process is omitted here.
4906let keyAgreement = cryptoFramework.createKeyAgreement('ECC256');
4907let keyAgreementPromise = keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey);
4908keyAgreementPromise.then(secret => {
4909  console.info('keyAgreement output is ' + secret.data);
4910}).catch((error: BusinessError) => {
4911  console.error("keyAgreement error.");
4912});
4913```
4914
4915**Sync示例:**
4916
4917<!--code_no_check-->
4918```ts
4919let asyGenerator = cryptoFramework.CreateAsyKeyGenerator("ECC256");
4920let globalKeyPair = asyGenerator.generateKeyPairSync();
4921let keyAgreement = cryptoFramework.createKeyAgreement('ECC256');
4922let secret = keyAgreement.generateSecretSync(globalKeyPair.priKey, globalKeyPair.pubKey);
4923console.info("[Sync]keyAgreement output is " + secret.data);
4924```
4925
4926## cryptoFramework.createMd
4927
4928createMd(algName: string): Md
4929
4930生成Md实例,用于进行消息摘要的计算与操作。
4931
4932支持的规格详见[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#支持的算法与规格)。
4933
4934**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4935
4936**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
4937
4938API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest
4939
4940**参数:**
4941
4942| 参数名  | 类型   | 必填 | 说明                                                         |
4943| ------- | ------ | ---- | ------------------------------------------------------------ |
4944| algName | string | 是   | 指定摘要算法,支持算法请参考[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#支持的算法与规格)。 |
4945
4946**返回值**:
4947
4948| 类型 | 说明                                    |
4949| ---- | --------------------------------------- |
4950| Md   | 返回由输入算法指定生成的[Md](#md)对象。 |
4951
4952**错误码:**
4953以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
4954
4955| 错误码ID | 错误信息           |
4956| -------- | ------------------ |
4957| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
4958| 17620001 | memory error.       |
4959
4960**示例:**
4961
4962```ts
4963import { cryptoFramework } from '@kit.CryptoArchitectureKit';
4964import { BusinessError } from '@kit.BasicServicesKit';
4965
4966try {
4967  // Set algName based on the algorithm supported.
4968  let md = cryptoFramework.createMd('SHA256');
4969} catch (error) {
4970  let e: BusinessError = error as BusinessError;
4971  console.error(`sync error, ${e.code}, ${e.message}`);
4972}
4973```
4974
4975## Md
4976
4977Md类,调用Md方法可以进行MD(Message Digest)摘要计算。调用前,需要通过[createMd](#cryptoframeworkcreatemd)构造Md实例。
4978
4979### 属性
4980
4981**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
4982
4983**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
4984
4985API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest
4986
4987| 名称    | 类型   | 可读 | 可写 | 说明                   |
4988| ------- | ------ | ---- | ---- | ---------------------- |
4989| algName | string | 是   | 否   | 代表指定的摘要算法名。 |
4990
4991### update
4992
4993update(input: DataBlob, callback: AsyncCallback\<void>): void
4994
4995传入消息进行Md更新计算,通过注册回调函数更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。
4996
4997> **说明:**
4998>
4999> - Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。
5000>
5001> - 该接口不支持轻量级智能穿戴。
5002
5003**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5004
5005**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5006
5007API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest
5008
5009**参数:**
5010
5011| 参数名   | 类型                  | 必填 | 说明         |
5012| -------- | --------------------- | ---- | ------------ |
5013| input    | [DataBlob](#datablob) | 是   | 传入的消息。 |
5014| callback | AsyncCallback\<void>  | 是   | 回调函数。当摘要更新成功,err为undefined,否则为错误对象。  |
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| 17630001 | crypto operation error. |
5023
5024### update
5025
5026update(input: DataBlob): Promise\<void>
5027
5028传入消息进行Md更新计算,通过Promise更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。
5029
5030> **说明:**
5031>
5032> - Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。
5033>
5034> - 该接口不支持轻量级智能穿戴。
5035
5036**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5037
5038**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5039
5040API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest
5041
5042| 参数名 | 类型     | 必填 | 说明         |
5043| ------ | -------- | ---- | ------------ |
5044| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
5045
5046**返回值:**
5047
5048| 类型           | 说明          |
5049| -------------- | ------------- |
5050| Promise\<void> | 无返回结果的Promise对象。 |
5051
5052**错误码:**
5053以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5054
5055| 错误码ID | 错误信息               |
5056| -------- | ---------------------- |
5057| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5058| 17630001 | crypto operation error. |
5059
5060### updateSync<sup>12+</sup>
5061
5062updateSync(input: DataBlob): void
5063
5064传入消息进行Md更新计算,通过同步方式更新。updateSync和digestSync为两段式接口,需要成组使用。其中digestSync必选,updateSync可选。
5065
5066> **说明:**
5067>
5068> Md算法多次调用updateSync更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。
5069
5070**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5071
5072**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5073
5074| 参数名 | 类型     | 必填 | 说明         |
5075| ------ | -------- | ---- | ------------ |
5076| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
5077
5078**返回值:**
5079
5080| 类型           | 说明          |
5081| -------------- | ------------- |
5082| void | 无返回结果。 |
5083
5084**错误码:**
5085以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5086
5087| 错误码ID | 错误信息               |
5088| -------- | ---------------------- |
5089| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.      |
5090| 17630001 | crypto operation error. |
5091
5092### digest
5093
5094digest(callback: AsyncCallback\<DataBlob>): void
5095
5096通过注册回调函数返回Md的计算结果。
5097
5098> **说明:**
5099>
5100> 该接口不支持轻量级智能穿戴。
5101
5102**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5103
5104**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5105
5106API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest
5107
5108| 参数名   | 类型                     | 必填 | 说明       |
5109| -------- | ------------------------ | ---- | ---------- |
5110| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取DataBlob数据。 |
5111
5112**错误码:**
5113以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5114
5115| 错误码ID | 错误信息               |
5116| -------- | ---------------------- |
5117| 17620001 | memory error.           |
5118| 17630001 | crypto operation error. |
5119
5120**示例:**
5121
5122```ts
5123import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5124import { buffer } from '@kit.ArkTS';
5125
5126function mdByCallback() {
5127  let md = cryptoFramework.createMd('SHA256');
5128  md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }, (err,) => {
5129    md.digest((err, digestOutput) => {
5130      console.info('[Callback]: MD result: ' + digestOutput.data);
5131      console.info('[Callback]: MD len: ' + md.getMdLength());
5132    });
5133  });
5134}
5135```
5136
5137### digest
5138
5139digest(): Promise\<DataBlob>
5140
5141通过Promise返回Md的计算结果。
5142
5143> **说明:**
5144>
5145> 该接口不支持轻量级智能穿戴。
5146
5147**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5148
5149**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5150
5151API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest
5152
5153**返回值:**
5154
5155| 类型               | 说明        |
5156| ------------------ | ----------- |
5157| Promise\<[DataBlob](#datablob)> | Promise对象。 |
5158
5159**错误码:**
5160以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5161
5162| 错误码ID | 错误信息               |
5163| -------- | ---------------------- |
5164| 17620001 | memory error.           |
5165| 17630001 | crypto operation error. |
5166
5167**示例:**
5168
5169```ts
5170import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5171import { buffer } from '@kit.ArkTS';
5172
5173async function mdByPromise() {
5174  let md = cryptoFramework.createMd('SHA256');
5175  await md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) });
5176  let mdOutput = await md.digest();
5177  console.info('[Promise]: MD result: ' + mdOutput.data);
5178  console.info('[Promise]: MD len: ' + md.getMdLength());
5179}
5180```
5181
5182### digestSync<sup>12+</sup>
5183
5184digestSync(): DataBlob
5185
5186通过同步方式返回Md的计算结果。
5187
5188**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5189
5190**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5191
5192**返回值:**
5193
5194| 类型               | 说明        |
5195| ------------------ | ----------- |
5196| [DataBlob](#datablob) | 表示生成的Md计算结果。 |
5197
5198**错误码:**
5199以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5200
5201| 错误码ID | 错误信息               |
5202| -------- | ---------------------- |
5203| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.         |
5204| 17620001 | memory error. |
5205| 17620002 | runtime error. |
5206| 17630001 | crypto operation error. |
5207
5208**示例:**
5209
5210```ts
5211import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5212import { buffer } from '@kit.ArkTS';
5213
5214async function mdBySync() {
5215  let md = cryptoFramework.createMd('SHA256');
5216  md.updateSync({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) });
5217  let mdOutput = md.digestSync();
5218  console.info('[Sync]: MD result: ' + mdOutput.data);
5219  console.info('[Sync]: MD len: ' + md.getMdLength());
5220}
5221```
5222
5223### getMdLength
5224
5225getMdLength(): number
5226
5227获取Md消息摘要长度(字节数)。
5228
5229**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5230
5231**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest
5232
5233API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest
5234
5235**返回值:**
5236
5237| 类型   | 说明                       |
5238| ------ | -------------------------- |
5239| number | 返回md计算结果的字节长度。 |
5240
5241**错误码:**
5242以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5243
5244| 错误码ID | 错误信息               |
5245| -------- | ---------------------- |
5246| 17630001 | crypto operation error. |
5247
5248**示例:**
5249
5250```ts
5251import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5252
5253function getLength() {
5254  let md = cryptoFramework.createMd('SHA256');
5255  console.info('[Promise]: MD len: ' + md.getMdLength());
5256}
5257```
5258
5259## cryptoFramework.createMac
5260
5261createMac(algName: string): Mac
5262
5263生成Mac实例,用于进行消息认证码的计算与操作。
5264
5265支持的规格详见[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac.md#支持的算法与规格)。
5266
5267**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5268
5269**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5270
5271API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5272
5273**参数:**
5274
5275| 参数名  | 类型   | 必填 | 说明                                                         |
5276| ------- | ------ | ---- | ------------------------------------------------------------ |
5277| algName | string | 是   | 指定摘要算法,支持算法请参考[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac.md#支持的算法与规格)。 |
5278
5279**返回值**:
5280
5281| 类型 | 说明                                      |
5282| ---- | ----------------------------------------- |
5283| Mac  | 返回由输入算法指定生成的[Mac](#mac)对象。 |
5284
5285**错误码:**
5286以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5287
5288| 错误码ID | 错误信息           |
5289| -------- | ------------------ |
5290| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5291| 17620001 | memory error.       |
5292
5293**示例:**
5294
5295```ts
5296import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5297import { BusinessError } from '@kit.BasicServicesKit';
5298
5299try {
5300  // Set algName based on the algorithm supported.
5301  let mac = cryptoFramework.createMac('SHA256');
5302} catch (error) {
5303  let e: BusinessError = error as BusinessError;
5304  console.error(`sync error, ${e.code}, ${e.message}`);
5305}
5306```
5307
5308## Mac
5309
5310Mac类,调用Mac方法可以进行MAC(Message Authentication Code)加密计算。调用前,需要通过[createMac](#cryptoframeworkcreatemac)构造Mac实例。
5311
5312### 属性
5313
5314**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5315
5316**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5317
5318API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5319
5320| 名称    | 类型   | 可读 | 可写 | 说明                   |
5321| ------- | ------ | ---- | ---- | ---------------------- |
5322| algName | string | 是   | 否   | 代表指定的摘要算法名。 |
5323
5324### init
5325
5326init(key: SymKey, callback: AsyncCallback\<void>): void
5327
5328使用对称密钥初始化Mac计算,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。
5329
5330  > **说明:**
5331  >
5332  > 建议通过[HMAC密钥生成规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md#hmac)创建对称密钥生成器,调用[generateSymKey](#generatesymkey)随机生成对称密钥或调用[convertKey](#convertkey)传入与密钥规格长度一致的二进制密钥数据生成密钥。<br/>当指定“HMAC”生成对称密钥生成器时,仅支持调用[convertKey](#convertkey)传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据生成密钥。
5333
5334**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5335
5336**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5337
5338API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5339
5340**参数:**
5341
5342| 参数名   | 类型                 | 必填 | 说明           |
5343| -------- | -------------------- | ---- | -------------- |
5344| key      | [SymKey](#symkey)    | 是   | 共享对称密钥。 |
5345| callback | AsyncCallback\<void> | 是   | 回调函数。当HMAC初始化成功,err为undefined,否则为错误对象。  |
5346
5347**错误码:**
5348以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5349
5350| 错误码ID | 错误信息               |
5351| -------- | ---------------------- |
5352| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5353| 17630001 | crypto operation error. |
5354
5355### init
5356
5357init(key: SymKey): Promise\<void>
5358
5359使用对称密钥初始化Mac计算,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。
5360
5361**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5362
5363**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5364
5365API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5366
5367**参数:**
5368
5369| 参数名 | 类型   | 必填 | 说明         |
5370| ------ | ------ | ---- | ------------ |
5371| key    | [SymKey](#symkey) | 是   | 共享对称密钥。 |
5372
5373**返回值:**
5374
5375| 类型           | 说明          |
5376| -------------- | ------------- |
5377| Promise\<void> | 无返回结果的Promise对象。 |
5378
5379**错误码:**
5380以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5381
5382| 错误码ID | 错误信息               |
5383| -------- | ---------------------- |
5384| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5385| 17630001 | crypto operation error. |
5386
5387### initSync<sup>12+</sup>
5388
5389initSync(key: SymKey): void
5390
5391使用对称密钥初始化Mac计算,通过同步方式获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。
5392
5393**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5394
5395**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5396
5397**参数:**
5398
5399| 参数名 | 类型   | 必填 | 说明         |
5400| ------ | ------ | ---- | ------------ |
5401| key    | [SymKey](#symkey) | 是   | 共享对称密钥。 |
5402
5403**返回值:**
5404
5405| 类型           | 说明          |
5406| -------------- | ------------- |
5407| void | 无返回结果。 |
5408
5409**错误码:**
5410以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5411
5412| 错误码ID | 错误信息               |
5413| -------- | ---------------------- |
5414| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.     |
5415| 17630001 | crypto operation error. |
5416
5417### update
5418
5419update(input: DataBlob, callback: AsyncCallback\<void>): void
5420
5421传入消息进行Mac更新计算,通过注册回调函数获取结果。
5422
5423> **说明:**
5424>
5425> HMAC算法多次调用update更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。
5426
5427**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5428
5429**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5430
5431API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5432
5433**参数:**
5434
5435| 参数名   | 类型                  | 必填 | 说明         |
5436| -------- | --------------------- | ---- | ------------ |
5437| input    | [DataBlob](#datablob) | 是   | 传入的消息。 |
5438| callback | AsyncCallback\<void>  | 是   | 回调函数。当HMAC更新成功,err为undefined,否则为错误对象。|
5439
5440**错误码:**
5441以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5442
5443| 错误码ID | 错误信息               |
5444| -------- | ---------------------- |
5445| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5446| 17630001 | crypto operation error. |
5447
5448### update
5449
5450update(input: DataBlob): Promise\<void>
5451
5452传入消息进行Mac更新计算,通过Promise获取结果。
5453
5454> **说明:**
5455>
5456> HMAC算法多次调用update更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。
5457
5458**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5459
5460**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5461
5462API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5463
5464**参数:**
5465
5466| 参数名 | 类型     | 必填 | 说明       |
5467| ------ | -------- | ---- | ---------- |
5468| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
5469
5470**返回值:**
5471
5472| 类型           | 说明          |
5473| -------------- | ------------- |
5474| Promise\<void> | 无返回结果的Promise对象。 |
5475
5476**错误码:**
5477以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5478
5479| 错误码ID | 错误信息               |
5480| -------- | ---------------------- |
5481| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5482| 17630001 | crypto operation error. |
5483
5484### updateSync<sup>12+</sup>
5485
5486updateSync(input: DataBlob): void
5487
5488传入消息进行Mac更新计算,通过同步方式获取结果。
5489
5490> **说明:**
5491>
5492> HMAC算法多次调用updateSync更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。
5493
5494**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5495
5496**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5497
5498**参数:**
5499
5500| 参数名 | 类型     | 必填 | 说明       |
5501| ------ | -------- | ---- | ---------- |
5502| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
5503
5504**返回值:**
5505
5506| 类型           | 说明          |
5507| -------------- | ------------- |
5508| void | 无返回结果的对象。 |
5509
5510**错误码:**
5511以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5512
5513| 错误码ID | 错误信息               |
5514| -------- | ---------------------- |
5515| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.      |
5516| 17630001 | crypto operation error. |
5517
5518### doFinal
5519
5520doFinal(callback: AsyncCallback\<DataBlob>): void
5521
5522通过注册回调函数返回Mac的计算结果。
5523
5524**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5525
5526**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5527
5528API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5529
5530**参数:**
5531
5532| 参数名   | 类型                     | 必填 | 说明     |
5533| -------- | ------------------------ | ---- | -------- |
5534| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取DataBlob数据。 |
5535
5536**错误码:**
5537以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5538
5539| 错误码ID | 错误信息               |
5540| -------- | ---------------------- |
5541| 17620001 | memory error.           |
5542| 17630001 | crypto operation error. |
5543
5544**示例:**
5545
5546此外,更多HMAC的完整示例可参考开发指导中[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。
5547
5548```ts
5549import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5550import { buffer } from '@kit.ArkTS';
5551
5552function hmacByCallback() {
5553  let mac = cryptoFramework.createMac('SHA256');
5554  let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) };
5555  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
5556  symKeyGenerator.convertKey(keyBlob, (err, symKey) => {
5557    mac.init(symKey, (err,) => {
5558      mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }, (err,) => {
5559        mac.doFinal((err, output) => {
5560          console.info('[Callback]: HMAC result: ' + output.data);
5561          console.info('[Callback]: MAC len: ' + mac.getMacLength());
5562        });
5563      });
5564    });
5565  });
5566}
5567```
5568
5569### doFinal
5570
5571doFinal(): Promise\<DataBlob>
5572
5573通过Promise返回Mac的计算结果。
5574
5575**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5576
5577**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5578
5579API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5580
5581**返回值:**
5582
5583| 类型               | 说明        |
5584| ------------------ | ----------- |
5585| Promise\<[DataBlob](#datablob)> | Promise对象。 |
5586
5587**错误码:**
5588以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5589
5590| 错误码ID | 错误信息               |
5591| -------- | ---------------------- |
5592| 17620001 | memory error.           |
5593| 17630001 | crypto operation error. |
5594
5595**示例:**
5596
5597此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。
5598
5599```ts
5600import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5601import { buffer } from '@kit.ArkTS';
5602
5603async function hmacByPromise() {
5604  let mac = cryptoFramework.createMac('SHA256');
5605  let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) };
5606  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
5607  let symKey = await symKeyGenerator.convertKey(keyBlob);
5608  await mac.init(symKey);
5609  await mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) });
5610  let macOutput = await mac.doFinal();
5611  console.info('[Promise]: HMAC result: ' + macOutput.data);
5612  console.info('[Promise]: MAC len: ' + mac.getMacLength());
5613}
5614```
5615
5616### doFinalSync<sup>12+</sup>
5617
5618doFinalSync(): DataBlob
5619
5620通过同步方式返回Mac的计算结果。
5621
5622**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5623
5624**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5625
5626**返回值:**
5627
5628| 类型               | 说明        |
5629| ------------------ | ----------- |
5630| [DataBlob](#datablob) | 返回Mac的计算结果。 |
5631
5632**错误码:**
5633以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5634
5635| 错误码ID | 错误信息               |
5636| -------- | ---------------------- |
5637| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.          |
5638| 17620001 | memory error.           |
5639| 17620002 | runtime error. |
5640| 17630001 | crypto operation error. |
5641
5642**示例:**
5643
5644此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。
5645
5646```ts
5647import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5648import { buffer } from '@kit.ArkTS';
5649
5650function hmacBySync() {
5651  let mac = cryptoFramework.createMac('SHA256');
5652  let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) };
5653  let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
5654  let symKey = symKeyGenerator.convertKeySync(keyBlob);
5655  mac.initSync(symKey);
5656  mac.updateSync({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) });
5657  let macOutput = mac.doFinalSync();
5658  console.info('[Sync]: HMAC result: ' + macOutput.data);
5659  console.info('[Sync]: MAC len: ' + mac.getMacLength());
5660}
5661```
5662
5663### getMacLength
5664
5665getMacLength(): number
5666
5667获取Mac消息认证码的长度(字节数)。
5668
5669**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5670
5671**系统能力:** SystemCapability.Security.CryptoFramework.Mac
5672
5673API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac
5674
5675**返回值:**
5676
5677| 类型   | 说明                        |
5678| ------ | --------------------------- |
5679| number | 返回mac计算结果的字节长度。 |
5680
5681**错误码:**
5682以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5683
5684| 错误码ID | 错误信息               |
5685| -------- | ---------------------- |
5686| 17630001 | crypto operation error. |
5687
5688**示例:**
5689
5690<!--code_no_check-->
5691```ts
5692import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5693import { BusinessError } from '@kit.BasicServicesKit';
5694
5695let mac = cryptoFramework.createMac('SHA256');
5696console.info('Mac algName is: ' + mac.algName);
5697let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
5698let keyBlob: cryptoFramework.DataBlob = { data: keyData };
5699let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128');
5700let promiseConvertKey = symKeyGenerator.convertKey(keyBlob);
5701promiseConvertKey.then(symKey => {
5702  let promiseMacInit = mac.init(symKey);
5703  return promiseMacInit;
5704}).then(() => {
5705  let blob: cryptoFramework.DataBlob = { data : new Uint8Array([83])};
5706  let promiseMacUpdate = mac.update(blob);
5707  return promiseMacUpdate;
5708}).then(() => {
5709  let promiseMacDoFinal = mac.doFinal();
5710  return promiseMacDoFinal;
5711}).then(macOutput => {
5712  console.info('[Promise]: HMAC result: ' + macOutput.data);
5713  let macLen = mac.getMacLength();
5714  console.info('MAC len: ' + macLen);
5715}).catch((error: BusinessError) => {
5716  console.error("[Promise]: error: " + error.message);
5717});
5718```
5719
5720## cryptoFramework.createRandom
5721
5722createRandom(): Random
5723
5724生成Random实例,用于进行随机数的计算与设置种子。
5725
5726支持的规格详见框架概述[随机数算法规格](../../security/CryptoArchitectureKit/crypto-generate-random-number.md#支持的算法与规格)。
5727
5728**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
5729
5730**系统能力:** SystemCapability.Security.CryptoFramework.Rand
5731
5732API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand
5733
5734**返回值**:
5735
5736| 类型   | 说明                                            |
5737| ------ | ----------------------------------------------- |
5738| Random | 返回由输入算法指定生成的[Random](#random)对象。 |
5739
5740**错误码:**
5741以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5742
5743| 错误码ID | 错误信息     |
5744| -------- | ------------ |
5745| 17620001 | memory error. |
5746
5747**示例:**
5748
5749```ts
5750import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5751import { BusinessError } from '@kit.BasicServicesKit';
5752
5753try {
5754  let rand = cryptoFramework.createRandom();
5755} catch (error) {
5756  let e: BusinessError = error as BusinessError;
5757  console.error(`sync error, ${e.code}, ${e.message}`);
5758}
5759```
5760
5761## Random
5762
5763Random类,调用Random方法可以进行随机数计算。调用前,需要通过[createRandom](#cryptoframeworkcreaterandom)构造Random实例。
5764
5765### 属性
5766
5767**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
5768
5769**系统能力:** SystemCapability.Security.CryptoFramework.Rand
5770
5771API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand
5772
5773| 名称    | 类型   | 可读 | 可写 | 说明                 |
5774| ------- | ------ | ---- | ---- | -------------------- |
5775| algName<sup>10+</sup> | string | 是   | 否   | 代表当前使用的随机数生成算法,目前只支持“CTR_DRBG"。 |
5776
5777### generateRandom
5778
5779generateRandom(len: number, callback: AsyncCallback\<DataBlob>): void
5780
5781异步生成指定长度的随机数,通过注册回调函数返回。
5782
5783> **说明:**
5784>
5785> 该接口不支持轻量级智能穿戴。
5786
5787**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
5788
5789**系统能力:** SystemCapability.Security.CryptoFramework.Rand
5790
5791API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand
5792
5793**参数:**
5794
5795| 参数名   | 类型                     | 必填 | 说明                 |
5796| -------- | ------------------------ | ---- | -------------------- |
5797| len      | number                   | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
5798| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取DataBlob数据。 |
5799
5800**错误码:**
5801以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5802
5803| 错误码ID | 错误信息               |
5804| -------- | ---------------------- |
5805| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5806| 17620001 | memory error.          |
5807| 17630001 | crypto operation error. |
5808
5809**示例:**
5810
5811```ts
5812import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5813
5814let rand = cryptoFramework.createRandom();
5815rand.generateRandom(12, (err, randData) => {
5816  if (err) {
5817    console.error("[Callback] err: " + err.code);
5818  } else {
5819    console.info('[Callback]: generate random result: ' + randData.data);
5820  }
5821});
5822```
5823
5824### generateRandom
5825
5826generateRandom(len: number): Promise\<DataBlob>
5827
5828异步生成指定长度的随机数,通过Promise返回。
5829
5830> **说明:**
5831>
5832> 该接口不支持轻量级智能穿戴。
5833
5834**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
5835
5836**系统能力:** SystemCapability.Security.CryptoFramework.Rand
5837
5838API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand
5839
5840**参数:**
5841
5842| 参数名 | 类型   | 必填 | 说明                                                   |
5843| ------ | ------ | ---- | ------------------------------------------------------ |
5844| len    | number | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
5845
5846**返回值:**
5847
5848| 类型               | 说明        |
5849| ------------------ | ----------- |
5850| Promise\<[DataBlob](#datablob)> | Promise对象。 |
5851
5852**错误码:**
5853以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5854
5855| 错误码ID | 错误信息               |
5856| -------- | ---------------------- |
5857| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5858| 17620001 | memory error.           |
5859| 17630001 | crypto operation error. |
5860
5861**示例:**
5862
5863```ts
5864import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5865import { BusinessError } from '@kit.BasicServicesKit';
5866
5867let rand = cryptoFramework.createRandom();
5868let promiseGenerateRand = rand.generateRandom(12);
5869promiseGenerateRand.then(randData => {
5870  console.info('[Promise]: rand result: ' + randData.data);
5871}).catch((error: BusinessError) => {
5872  console.error("[Promise]: error: " + error.message);
5873});
5874```
5875
5876### generateRandomSync<sup>10+</sup>
5877
5878generateRandomSync(len: number): DataBlob
5879
5880同步生成指定长度的随机数。
5881
5882**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
5883
5884**系统能力:** SystemCapability.Security.CryptoFramework.Rand
5885
5886API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand
5887
5888**参数:**
5889
5890| 参数名 | 类型   | 必填 | 说明                 |
5891| ------ | ------ | ---- | -------------------- |
5892| len    | number | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
5893
5894**返回值:**
5895
5896| 类型               | 说明        |
5897| ------------------ | ----------- |
5898|[DataBlob](#datablob) | 表示生成的随机数。 |
5899
5900**错误码:**
5901以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5902
5903| 错误码ID | 错误信息               |
5904| -------- | ---------------------- |
5905| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
5906| 17620001 | memory error.           |
5907| 17630001 | crypto operation error. |
5908
5909**示例:**
5910
5911```ts
5912import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5913import { BusinessError } from '@kit.BasicServicesKit';
5914
5915let rand = cryptoFramework.createRandom();
5916try {
5917  let randData = rand.generateRandomSync(12);
5918  if (randData != null) {
5919    console.info('[Sync]: rand result: ' + randData.data);
5920  } else {
5921    console.error("[Sync]: get rand result fail!");
5922  }
5923} catch (error) {
5924  let e: BusinessError = error as BusinessError;
5925  console.error(`sync error, ${e.code}, ${e.message}`);
5926}
5927```
5928
5929### setSeed
5930
5931setSeed(seed: DataBlob): void
5932
5933设置指定的种子。
5934
5935**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
5936
5937**系统能力:** SystemCapability.Security.CryptoFramework.Rand
5938
5939API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand
5940
5941| 参数名 | 类型     | 必填 | 说明         |
5942| ------ | -------- | ---- | ------------ |
5943| seed   | [DataBlob](#datablob) | 是   | 设置的种子。 |
5944
5945**错误码:**
5946以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
5947
5948| 错误码ID | 错误信息           |
5949| -------- | ----------------- |
5950| 17620001 | memory error.      |
5951
5952**示例:**
5953
5954```ts
5955import { cryptoFramework } from '@kit.CryptoArchitectureKit';
5956import { BusinessError } from '@kit.BasicServicesKit';
5957
5958let rand = cryptoFramework.createRandom();
5959rand.generateRandom(12, (err, randData) => {
5960  if (err) {
5961    console.error("[Callback] err: " + err.code);
5962  } else {
5963    console.info('[Callback]: generate random result: ' + randData.data);
5964    try {
5965      rand.setSeed(randData);
5966    } catch (error) {
5967      let e: BusinessError = error as BusinessError;
5968      console.error(`sync error, ${e.code}, ${e.message}`);
5969    }
5970  }
5971});
5972```
5973
5974## cryptoFramework.createKdf<sup>11+</sup>
5975
5976createKdf(algName: string): Kdf
5977
5978密钥派生函数(key derivation function)实例生成。<br/>支持的规格详见[密钥派生函数规格](../../security/CryptoArchitectureKit/crypto-key-derivation-overview.md)。
5979
5980**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
5981
5982**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
5983
5984API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf
5985
5986**参数:**
5987
5988| 参数名  | 类型   | 必填 | 说明                              |
5989| ------- | ------ | ---- | --------------------------------- |
5990| algName | string | 是   | 指定密钥派生算法(包含HMAC配套的散列函数):目前支持PBKDF2、HKDF算法,如"PBKDF2\|SHA256", "HKDF\|SHA256"。 |
5991
5992**返回值**:
5993
5994| 类型         | 说明                                       |
5995| ------------ | ------------------------------------------ |
5996| [Kdf](#kdf11) | 返回由输入算法指定生成的Kdf对象。 |
5997
5998**错误码:**
5999以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6000
6001| 错误码ID | 错误信息               |
6002| -------- | ---------------------- |
6003| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6004| 801 | this operation is not supported.          |
6005| 17620001 | memory error.          |
6006
6007**示例:**
6008- PBKDF2算法
6009```ts
6010import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6011
6012let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
6013```
6014
6015## Kdf<sup>11+</sup>
6016
6017密钥派生函数(key derivation function)类,使用密钥派生方法之前需要创建该类的实例进行操作,通过createKdf(algName: string): Kdf方法构造此实例。
6018
6019### 属性
6020
6021**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6022
6023**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6024
6025API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf
6026
6027| 名称    | 类型   | 可读 | 可写 | 说明                         |
6028| ------- | ------ | ---- | ---- | ---------------------------- |
6029| algName | string | 是   | 否   | 密钥派生函数的算法名称。 |
6030
6031### generateSecret
6032
6033generateSecret(params: KdfSpec, callback: AsyncCallback\<DataBlob>): void
6034
6035基于传入的密钥派生参数进行密钥派生,通过注册回调函数返回派生得到的密钥。
6036
6037**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6038
6039**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6040
6041API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf
6042
6043**参数:**
6044
6045| 参数名   | 类型                     | 必填 | 说明                   |
6046| -------- | ------------------------ | ---- | ---------------------- |
6047| params   | [KdfSpec](#kdfspec11)        | 是   | 设置密钥派生函数的参数。 |
6048| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数,用于获取派生得到的密钥DataBlob数据。 |
6049
6050**错误码:**
6051以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6052
6053| 错误码ID | 错误信息               |
6054| -------- | ---------------------- |
6055| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6056| 17620001 | memory error.          |
6057| 17630001 | crypto operation error. |
6058
6059**示例:**
6060
6061- PBKDF2算法
6062  ```ts
6063  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6064
6065  let spec: cryptoFramework.PBKDF2Spec = {
6066    algName: 'PBKDF2',
6067    password: '123456',
6068    salt: new Uint8Array(16),
6069    iterations: 10000,
6070    keySize: 32
6071  };
6072  let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
6073  kdf.generateSecret(spec, (err, secret) => {
6074    if (err) {
6075      console.error("key derivation error.");
6076      return;
6077    }
6078    console.info('key derivation output is ' + secret.data);
6079  });
6080  ```
6081
6082- HKDF算法
6083  ```ts
6084  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6085
6086  let spec: cryptoFramework.HKDFSpec = {
6087    algName: 'HKDF',
6088    key: '123456',
6089    salt: new Uint8Array(16),
6090    info: new Uint8Array(16),
6091    keySize: 32
6092  };
6093  let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND');
6094  kdf.generateSecret(spec, (err, secret) => {
6095    if (err) {
6096      console.error("key derivation error.");
6097      return;
6098    }
6099    console.info('key derivation output is ' + secret.data);
6100  });
6101  ```
6102
6103### generateSecret
6104
6105generateSecret(params: KdfSpec): Promise\<DataBlob>
6106
6107基于传入的密钥派生参数进行密钥派生,通过Promise形式返回派生得到的密钥。
6108
6109**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6110
6111**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6112
6113API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf
6114
6115**参数:**
6116
6117| 参数名 | 类型   | 必填 | 说明                   |
6118| ------ | ------ | ---- | ---------------------- |
6119| params   | [KdfSpec](#kdfspec11)        | 是   | 设置密钥派生函数的参数。 |
6120
6121**返回值:**
6122
6123| 类型               | 说明     |
6124| ------------------ | -------- |
6125| Promise\<[DataBlob](#datablob)> | 回调函数,用于获取派生得到的密钥DataBlob数据。 |
6126
6127**错误码:**
6128以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6129
6130| 错误码ID | 错误信息               |
6131| -------- | ---------------------- |
6132| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.|
6133| 17620001 | memory error.          |
6134| 17630001 | crypto operation error. |
6135
6136**示例:**
6137
6138- PBKDF2算法
6139  ```ts
6140  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6141  import { BusinessError } from '@kit.BasicServicesKit';
6142
6143  let spec: cryptoFramework.PBKDF2Spec = {
6144    algName: 'PBKDF2',
6145    password: '123456',
6146    salt: new Uint8Array(16),
6147    iterations: 10000,
6148    keySize: 32
6149  };
6150  let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
6151  let kdfPromise = kdf.generateSecret(spec);
6152  kdfPromise.then(secret => {
6153    console.info('key derivation output is ' + secret.data);
6154  }).catch((error: BusinessError) => {
6155    console.error("key derivation error, " + error.message);
6156  });
6157  ```
6158
6159- HKDF算法
6160  ```ts
6161  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6162  import { BusinessError } from '@kit.BasicServicesKit';
6163
6164  let spec: cryptoFramework.HKDFSpec = {
6165    algName: 'HKDF',
6166    key: '123456',
6167    salt: new Uint8Array(16),
6168    info: new Uint8Array(16),
6169    keySize: 32
6170  };
6171  let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND');
6172  let kdfPromise = kdf.generateSecret(spec);
6173  kdfPromise.then(secret => {
6174    console.info('key derivation output is ' + secret.data);
6175  }).catch((error: BusinessError) => {
6176    console.error("key derivation error, " + error.message);
6177  });
6178  ```
6179
6180### generateSecretSync<sup>12+</sup>
6181
6182generateSecretSync(params: KdfSpec): DataBlob
6183
6184基于传入的密钥派生参数进行密钥派生,通过同步方式返回派生得到的密钥。
6185
6186**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
6187
6188**系统能力:** SystemCapability.Security.CryptoFramework.Kdf
6189
6190**参数:**
6191
6192| 参数名 | 类型   | 必填 | 说明                   |
6193| ------ | ------ | ---- | ---------------------- |
6194| params   | [KdfSpec](#kdfspec11)        | 是   | 设置密钥派生函数的参数。 |
6195
6196**返回值:**
6197
6198| 类型               | 说明     |
6199| ------------------ | -------- |
6200| [DataBlob](#datablob) | 用于获取派生得到的密钥DataBlob数据。 |
6201
6202**错误码:**
6203以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)
6204
6205| 错误码ID | 错误信息               |
6206| -------- | ---------------------- |
6207| 401 | invalid parameters.  Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.  |
6208| 17620001 | memory error.          |
6209| 17620002 | runtime error. |
6210| 17630001 | crypto operation error. |
6211
6212**示例:**
6213
6214- PBKDF2算法
6215  ```ts
6216  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6217
6218  let spec: cryptoFramework.PBKDF2Spec = {
6219    algName: 'PBKDF2',
6220    password: '123456',
6221    salt: new Uint8Array(16),
6222    iterations: 10000,
6223    keySize: 32
6224  };
6225  let kdf = cryptoFramework.createKdf('PBKDF2|SHA256');
6226  let secret = kdf.generateSecretSync(spec);
6227  console.info("[Sync]key derivation output is " + secret.data);
6228  ```
6229
6230- HKDF算法
6231  ```ts
6232  import { cryptoFramework } from '@kit.CryptoArchitectureKit';
6233
6234  let spec: cryptoFramework.HKDFSpec = {
6235    algName: 'HKDF',
6236    key: '123456',
6237    salt: new Uint8Array(16),
6238    info: new Uint8Array(16),
6239    keySize: 32
6240  };
6241  let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND');
6242  let secret = kdf.generateSecretSync(spec);
6243  console.info("[Sync]key derivation output is " + secret.data);
6244  ```