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