js-apis-cryptoFramework.md 142.0 KB
Newer Older
W
wangyongzhong2 已提交
1 2 3 4 5 6 7 8 9 10
# @ohos.security.cryptoFramework (加解密算法库框架)

为屏蔽底层硬件和算法库,向上提供统一的密码算法库加解密相关接口。

> **说明:**
>
> 本模块首批接口从API version 9开始支持。

## 导入模块

X
xwb 已提交
11
```js
W
wangyongzhong2 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
import cryptoFramework from "@ohos.security.cryptoFramework"
```

## Result

 表示执行结果的枚举。

 **系统能力:** SystemCapability.Security.CryptoFramework

| 名称                                  |    值   |   说明                         |
| ------------------------------------- | -------- | ---------------------------- |
| INVALID_PARAMS                        | 401      | 非法入参。                   |
| NOT_SUPPORT                           | 801      | 操作不支持。                 |
| ERR_OUT_OF_MEMORY                     | 17620001 | 内存错误。                   |
| ERR_RUNTIME_ERROR                     | 17620002 | 运行时外部错误。             |
X
xwb 已提交
27
| ERR_CRYPTO_OPERATION                  | 17630001 | 调用三方算 法库API出错。     |
W
wangyongzhong2 已提交
28 29 30 31 32 33 34 35 36 37 38

## DataBlob

buffer数组。

 **系统能力:** SystemCapability.Security.CryptoFramework

| 名称 | 类型       | 可读 | 可写 | 说明   |
| ---- | ---------- | ---- | ---- | ------ |
| data | Uint8Array | 是   | 是   | 数据。 |

X
xwb 已提交
39
## ParamsSpec
W
wangyongzhong2 已提交
40

X
xwb 已提交
41
加解密参数,在进行对称加解密时需要构造其子类对象,并将子类对象传入[init()](#init-2)方法。<br/>适用于需要iv等参数的对称加解密模式(对于无iv等参数的模式如ECB模式,无需构造,在[init()](#init-2)中传入null即可)。
W
wangyongzhong2 已提交
42

X
xwb 已提交
43
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
44

X
xwb 已提交
45 46 47
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
| algName | string | 是   | 是   | 指明对称加解密参数的算法模式。可选值如下:<br/>- "IvParamsSpec": 适用于CBC\|CTR\|OFB\|CFB模式<br/>- "GcmParamsSpec": 适用于GCM模式<br/>- "CcmParamsSpec": 适用于CCM模式 |
W
wangyongzhong2 已提交
48

X
xwb 已提交
49 50
> **说明:**
>
X
xwb 已提交
51
> 由于[init()](#init-2)的params参数是ParamsSpec类型(父类),而实际需要传入具体的子类对象(如IvParamsSpec),因此在构造子类对象时应设置其父类ParamsSpec的algName参数,使算法库在init()时知道传入的是哪种子类对象。
W
wangyongzhong2 已提交
52

X
xwb 已提交
53
## IvParamsSpec
W
wangyongzhong2 已提交
54

X
xwb 已提交
55
加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。<br/>适用于CBC、CTR、OFB、CFB这些仅使用iv作为参数的加解密模式。
W
wangyongzhong2 已提交
56

X
xwb 已提交
57
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
58

X
xwb 已提交
59 60
| 名称 | 类型                  | 可读 | 可写 | 说明                                                         |
| ---- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
W
wutiantian_gitee 已提交
61
| 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字节。 |
W
wangyongzhong2 已提交
62

X
xwb 已提交
63 64
> **说明:**
>
X
xwb 已提交
65
> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
W
wangyongzhong2 已提交
66

X
xwb 已提交
67
## GcmParamsSpec
W
wangyongzhong2 已提交
68

X
xwb 已提交
69
加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。<br/>适用于GCM模式。
W
wangyongzhong2 已提交
70

X
xwb 已提交
71
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
72

X
xwb 已提交
73 74 75 76 77
| 名称    | 类型                  | 可读 | 可写 | 说明                                                         |
| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
| iv      | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数iv,长度为12字节。                             |
| aad     | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数aad,长度为8字节。                             |
| authTag | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数authTag,长度为16字节。<br/>采用GCM模式加密时,需要获取[doFinal()](#dofinal-2)输出的[DataBlob](#datablob),取出其末尾16字节作为解密时[init()](#init-2)方法的入参[GcmParamsSpec](#gcmparamsspec)中的的authTag。 |
W
wangyongzhong2 已提交
78

X
xwb 已提交
79 80
> **说明:**
>
X
xwb 已提交
81
> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
W
wangyongzhong2 已提交
82

X
xwb 已提交
83
## CcmParamsSpec
W
wangyongzhong2 已提交
84

X
xwb 已提交
85
加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。<br/>适用于CCM模式。
W
wangyongzhong2 已提交
86 87 88

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
89 90 91 92 93
| 名称    | 类型                  | 可读 | 可写 | 说明                                                         |
| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
| iv      | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数iv,长度为7字节。                              |
| aad     | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数aad,长度为8字节。                             |
| authTag | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数authTag,长度为12字节。<br/>采用CCM模式加密时,需要获取[doFinal()](#dofinal-2)输出的[DataBlob](#datablob),取出其末尾12字节作为解密时[init()](#init-2)方法的入参[CcmParamsSpec](#ccmparamsspec)中的authTag。 |
W
wangyongzhong2 已提交
94

X
xwb 已提交
95 96
> **说明:**
>
X
xwb 已提交
97
> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
W
wangyongzhong2 已提交
98

X
xwb 已提交
99
## CryptoMode
W
wangyongzhong2 已提交
100

X
xwb 已提交
101
表示加解密操作的枚举。
W
wangyongzhong2 已提交
102 103 104

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
105 106 107 108
| 名称         | 值   | 说明               |
| ------------ | ---- | ------------------ |
| ENCRYPT_MODE | 0    | 表示进行加密操作。 |
| DECRYPT_MODE | 1    | 表示进行解密操作。 |
W
wangyongzhong2 已提交
109

X
xwb 已提交
110
## AsyKeySpecItem<sup>10+</sup>
W
wangyongzhong2 已提交
111

X
xwb 已提交
112
表示密钥参数的枚举。
W
wangyongzhong2 已提交
113

X
xwb 已提交
114
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
115

X
xwb 已提交
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
| 名称         | 值   | 说明             |
| ------------ | ---- | ---------------- |
| DSA_P_BN | 101 | DSA算法的素模数p。 |
| DSA_Q_BN | 102 | DSA算法中密钥参数q(p-1的素因子)。 |
| DSA_G_BN | 103 | DSA算法的参数g。 |
| DSA_SK_BN | 104 | DSA算法的私钥sk。 |
| DSA_PK_BN | 105 | DSA算法的公钥pk。 |
| ECC_FP_P_BN | 201 | DSA算法中表示椭圆曲线Fp域的素数p。 |
| ECC_A_BN | 202 | DSA算法中椭圆曲线的第一个系数a。 |
| ECC_B_BN | 203 | DSA算法中椭圆曲线的第二个系数b。 |
| ECC_G_X_BN | 204 | ECC算法中基点g的x坐标。 |
| ECC_G_Y_BN | 205 | ECC算法中基点g的y坐标。 |
| ECC_N_BN | 206 | ECC算法中基点g的阶n。 |
| ECC_H_NUM | 207 | ECC算法中的余因子h。 |
| ECC_SK_BN | 208 | ECC算法中的私钥sk。 |
| ECC_PK_X_BN | 209 | ECC算法中,公钥pk(椭圆曲线上的一个点)的x坐标。 |
| ECC_PK_Y_BN | 210 | ECC算法中,公钥pk(椭圆曲线上的一个点)的y坐标。 |
| ECC_FIELD_TYPE_STR | 211 | ECC算法中,椭圆曲线的域类型(当前只支持Fp域)。 |
| ECC_FIELD_SIZE_NUM | 212 | ECC算法中域的大小,单位为bits(注:对于Fp域,域的大小为素数p的bits长度)。 |
| ECC_CURVE_NAME_STR | 213 | ECC算法中的SECG曲线名称。 |
| RSA_N_BN | 301 | RSA算法中的模数n。 |
| RSA_SK_BN | 302 | RSA算法中的私钥sk(即私钥指数d)。 |
| RSA_PK_BN | 303 | RSA算法中的公钥pk(即公钥指数e)。 |

## AsyKeySpecType<sup>10+</sup>

表示密钥参数类型的枚举。
W
wangyongzhong2 已提交
143

X
xwb 已提交
144
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
145

X
xwb 已提交
146 147
| 名称         | 值   | 说明             |
| ------------ | ---- | ---------------- |
X
xwb 已提交
148 149
| COMMON_PARAMS_SPEC | 0 | 表示公私钥中包含的公共参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair-2)随机生成密钥对。 |
| PRIVATE_KEY_SPEC | 1 | 表示私钥中包含的参数。使用此类型的参数可以调用[generatePriKey](#generateprikey)生成指定的私钥。 |
X
xwb 已提交
150
| PUBLIC_KEY_SPEC | 2 | 表示公钥中包含的参数。使用此类型的参数可以调用[generatePubKey](#generatepubkey)生成指定的公钥。 |
X
xwb 已提交
151
| KEY_PAIR_SPEC | 3 | 表示公私钥中包含的全量参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair-2)生成指定的密钥对。 |
W
wangyongzhong2 已提交
152

X
xwb 已提交
153 154
## CipherSpecItem<sup>10+</sup>

X
xwb 已提交
155
表示加解密参数的枚举,这些加解密参数支持通过[setCipherSpec](#setcipherspec10)接口设置/通过[getCipherSpec](#getcipherspec10)接口获取。<br/>当前只支持RSA算法,详细规格请参考框架概述[加解密规格](../../security/cryptoFramework-overview.md#加解密规格)
W
wangyongzhong2 已提交
156

X
xwb 已提交
157 158 159 160 161 162 163 164
**系统能力:** SystemCapability.Security.CryptoFramework

| 名称         | 值   | 说明             |
| ------------ | ---- | ---------------- |
| OAEP_MD_NAME_STR | 100 | 表示RSA算法中,使用PKCS1_OAEP模式时,消息摘要功能的算法名。 |
| OAEP_MGF_NAME_STR | 101 | 表示RSA算法中,使用PKCS1_OAEP模式时,掩码生成算法(目前仅支持MGF1)。 |
| OAEP_MGF1_MD_STR | 102 | 表示RSA算法中,使用PKCS1_OAEP模式时,MGF1掩码生成功能的消息摘要算法。 |
| OAEP_MGF1_PSRC_UINT8ARR | 103 | 表示RSA算法中,使用PKCS1_OAEP模式时,pSource的字节流。 |
W
wangyongzhong2 已提交
165

X
xwb 已提交
166 167
## SignSpecItem<sup>10+</sup>

X
xwb 已提交
168
表示签名验签参数的枚举,这些签名验签参数支持通过[setSignSpec](#setsignspec10)[setVerifySpec](#setverifyspec10)接口设置/通过[getSignSpec](#getsignspec10)[getVerifySpec](#getverifyspec10)接口获取。<br/>当前只支持RSA算法,详细规格请参考框架概述[加解密规格](../../security/cryptoFramework-overview.md#加解密规格)
W
wangyongzhong2 已提交
169 170 171

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
172 173 174 175 176 177 178
| 名称         | 值   | 说明             |
| ------------ | ---- | ---------------- |
| PSS_MD_NAME_STR | 100 | 表示RSA算法中,使用PSS模式时,消息摘要功能的算法名。 |
| PSS_MGF_NAME_STR | 101 | 表示RSA算法中,使用PSS模式时,掩码生成算法(目前仅支持MGF1)。 |
| PSS_MGF1_MD_STR | 102 | 表示RSA算法中,使用PSS模式时,MGF1掩码生成功能的消息摘要参数。 |
| PSS_SALT_LEN_NUM | 103 | 表示RSA算法中,使用PSS模式时,盐值的长度,长度以字节为单位。 |
| PSS_TRAILER_FIELD_NUM | 104 | 表示RSA算法中,使用PSS模式时,用于编码操作的整数,值为1。 |
W
wangyongzhong2 已提交
179

X
xwb 已提交
180
## AsyKeySpec<sup>10+</sup>
W
wangyongzhong2 已提交
181

X
xwb 已提交
182
指定非对称密钥参数的基本接口,用于创建密钥生成器。在指定非对称密钥参数时需要构造其子类对象,并将子类对象传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。构造子类对象时,所有bigint类型的密钥参数均采用大端写法,并使用正数。
W
wangyongzhong2 已提交
183

X
xwb 已提交
184
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
185

X
xwb 已提交
186 187 188
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
| algName | string | 是   | 是   | 指定非对称密钥的算法名称,比如"RSA"、"DSA"、"ECC"。 |
X
xwb 已提交
189
| specType | [AsyKeySpecType](#asykeyspectype10) | 是   | 是 | 指定密钥参数类型,用于区分公/私钥参数。 |
W
wangyongzhong2 已提交
190

X
xwb 已提交
191
## DSACommonParamsSpec<sup>10+</sup>
W
wangyongzhong2 已提交
192

X
xwb 已提交
193
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的公共参数,随机生成公/私钥。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
194

X
xwb 已提交
195
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
196

X
xwb 已提交
197 198 199 200 201
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
| p | bigint | 是   | 是   | 指定DSA算法的素模数p。 |
| q | bigint | 是   | 是   | 指定DSA算法中密钥参数q(p-1的素因子)。 |
| g | bigint | 是   | 是   | 指定DSA算法的参数g。 |
W
wangyongzhong2 已提交
202

X
xwb 已提交
203
## DSAPubKeySpec<sup>10+</sup>
W
wangyongzhong2 已提交
204

X
xwb 已提交
205
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公钥包含的参数。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
206

X
xwb 已提交
207
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
208

X
xwb 已提交
209 210
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
X
xwb 已提交
211
| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 是   | 是   | 指定DSA算法中公私钥都包含的公共参数。 |
X
xwb 已提交
212
| pk | bigint | 是   | 是   | 指定DSA算法的公钥。 |
W
wangyongzhong2 已提交
213

X
xwb 已提交
214
## DSAKeyPairSpec<sup>10+</sup>
W
wangyongzhong2 已提交
215

X
xwb 已提交
216
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的全量参数。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
217 218 219

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
220 221
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
X
xwb 已提交
222
| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 是   | 是   | 指定DSA算法中公私钥都包含的公共参数。 |
X
xwb 已提交
223 224
| sk | bigint | 是   | 是   | 指定DSA算法的私钥sk。 |
| pk | bigint | 是   | 是   | 指定DSA算法的公钥pk。 |
W
wangyongzhong2 已提交
225

X
xwb 已提交
226
## ECField<sup>10+</sup>
W
wangyongzhong2 已提交
227

X
xwb 已提交
228
指定椭圆曲线的域。当前只支持Fp域。
W
wangyongzhong2 已提交
229

X
xwb 已提交
230
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
231

X
xwb 已提交
232 233 234
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
| fieldType | string | 是   | 是   | 指定椭圆曲线域的类型,当前只支持"Fp"。 |
W
wangyongzhong2 已提交
235

X
xwb 已提交
236
## ECFieldFp<sup>10+</sup>
W
wangyongzhong2 已提交
237

X
xwb 已提交
238
指定椭圆曲线素数域。是[ECField](#ecfield10)的子类。
W
wangyongzhong2 已提交
239

X
xwb 已提交
240
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
241

X
xwb 已提交
242 243 244
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
| p | bigint | 是   | 是   | 指定素数p。 |
W
wangyongzhong2 已提交
245

X
xwb 已提交
246
## Point<sup>10+</sup>
W
wangyongzhong2 已提交
247

X
xwb 已提交
248
指定椭圆曲线上的一个点。
W
wangyongzhong2 已提交
249 250 251

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
252 253 254 255
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
| x | bigint | 是   | 是   | 指定椭圆曲线上,点的x坐标。 |
| y | bigint | 是   | 是   | 指定椭圆曲线上,点的y坐标。 |
W
wangyongzhong2 已提交
256

X
xwb 已提交
257
## ECCCommonParamsSpec<sup>10+</sup>
W
wangyongzhong2 已提交
258

X
xwb 已提交
259
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的公共参数,随机生成公/私钥。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
260

X
xwb 已提交
261
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
262

X
xwb 已提交
263 264
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
X
xwb 已提交
265
| field | [ECField](#ecfield10) | 是   | 是   | 指定椭圆曲线的域(当前只支持Fp域)。 |
X
xwb 已提交
266 267
| a | bigint | 是   | 是   | 指定椭圆曲线的第一个系数a。 |
| b | bigint | 是   | 是   | 指定椭圆曲线的第二个系数b。 |
X
xwb 已提交
268
| g | [Point](#point10) | 是   | 是   | 指定基点g。 |
X
xwb 已提交
269 270
| n | bigint | 是   | 是   | 指定基点g的阶数n。 |
| h | number | 是   | 是   | 指定余因子h。 |
W
wangyongzhong2 已提交
271

X
xwb 已提交
272
## ECCPriKeySpec<sup>10+</sup>
W
wangyongzhong2 已提交
273

X
xwb 已提交
274
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中私钥包含的参数。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
275

X
xwb 已提交
276
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
277

X
xwb 已提交
278 279
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
X
xwb 已提交
280
| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是   | 是   | 指定ECC算法中公私钥都包含的公共参数。 |
X
xwb 已提交
281
| sk | bigint | 是   | 是   | 指定ECC算法的私钥sk。 |
W
wangyongzhong2 已提交
282

X
xwb 已提交
283
## ECCPubKeySpec<sup>10+</sup>
W
wangyongzhong2 已提交
284

X
xwb 已提交
285
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公钥包含的参数。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
286

X
xwb 已提交
287 288 289 290
**系统能力:** SystemCapability.Security.CryptoFramework

| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
X
xwb 已提交
291 292
| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是   | 是   | 指定ECC算法中公私钥都包含的公共参数。 |
| pk | [Point](#point10) | 是   | 是   | 指定ECC算法的公钥pk。 |
W
wangyongzhong2 已提交
293

X
xwb 已提交
294
## ECCKeyPairSpec<sup>10+</sup>
W
wangyongzhong2 已提交
295

X
xwb 已提交
296
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的全量参数。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
297 298 299

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
300 301
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
X
xwb 已提交
302
| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是   | 是   | 指定ECC算法中公私钥都包含的公共参数。 |
X
xwb 已提交
303
| sk | bigint | 是   | 是   | 指定ECC算法的私钥sk。 |
X
xwb 已提交
304
| pk | [Point](#point10) | 是   | 是   | 指定ECC算法的公钥pk。 |
W
wangyongzhong2 已提交
305

X
xwb 已提交
306
## RSACommonParamsSpec<sup>10+</sup>
W
wangyongzhong2 已提交
307

X
xwb 已提交
308
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的公共参数,随机生成公/私钥。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
309

X
xwb 已提交
310
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
311

X
xwb 已提交
312 313 314
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
| n | bigint | 是   | 是   | 指定模数n。 |
W
wangyongzhong2 已提交
315

X
xwb 已提交
316
## RSAPubKeySpec<sup>10+</sup>
W
wangyongzhong2 已提交
317

X
xwb 已提交
318
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公钥包含的参数。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
319

X
xwb 已提交
320
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
321

X
xwb 已提交
322 323
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
X
xwb 已提交
324
| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 是   | 是   | 指定RSA算法中公私钥都包含的公共参数。 |
X
xwb 已提交
325
| pk | bigint | 是   | 是   | 指定RSA算法的公钥pk。 |
W
wangyongzhong2 已提交
326

X
xwb 已提交
327
## RSAKeyPairSpec<sup>10+</sup>
W
wangyongzhong2 已提交
328

X
xwb 已提交
329
密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的全量参数。<br/>在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。
W
wangyongzhong2 已提交
330

X
xwb 已提交
331
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
332

X
xwb 已提交
333 334
| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
X
xwb 已提交
335
| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 是   | 是   | 指定RSA算法中公私钥都包含的公共参数。 |
X
xwb 已提交
336 337
| sk | bigint | 是   | 是   | 指定RSA算法的私钥sk。 |
| pk | bigint | 是   | 是   | 指定RSA算法的公钥pk。 |
W
wangyongzhong2 已提交
338

X
xwb 已提交
339
## Key
W
wangyongzhong2 已提交
340

X
xwb 已提交
341
密钥(父类),在运行密码算法(如加解密)时需要提前生成其子类对象,并传入[Cipher](#cipher)实例的[init()](#init-2)方法。<br/>密钥可以通过密钥生成器来生成。
W
wangyongzhong2 已提交
342

X
xwb 已提交
343
### 属性
W
wangyongzhong2 已提交
344

345
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
346

X
xwb 已提交
347 348 349 350
| 名称    | 类型   | 可读 | 可写 | 说明                         |
| ------- | ------ | ---- | ---- | ---------------------------- |
| format  | string | 是   | 否   | 密钥的格式。                 |
| algName | string | 是   | 否   | 密钥对应的算法名(含长度)。 |
W
wangyongzhong2 已提交
351

X
xwb 已提交
352
### getEncoded
W
wangyongzhong2 已提交
353

X
xwb 已提交
354
getEncoded(): DataBlob
W
wangyongzhong2 已提交
355

X
xwb 已提交
356
以同步方法,获取密钥数据的字节流。密钥可以为对称密钥,公钥或者私钥。其中,公钥格式满足ASN.1语法、X.509规范、DER编码格式;私钥格式满足ASN.1语法,PKCS#8规范、DER编码方式。
W
wangyongzhong2 已提交
357

X
xwb 已提交
358 359
> **说明:**
>
X
xwb 已提交
360 361
> RSA算法使用密钥参数生成私钥时,私钥对象不支持getEncoded。

W
wangyongzhong2 已提交
362 363 364 365
**系统能力:** SystemCapability.Security.CryptoFramework

**返回值:**

X
xwb 已提交
366 367 368
| 类型                  | 说明                     |
| --------------------- | ------------------------ |
| [DataBlob](#datablob) | 用于查看密钥的具体内容。 |
W
wangyongzhong2 已提交
369 370 371 372 373

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
374 375
| 801 | this operation is not supported. |
| 17620001 | memory error. |
W
wangyongzhong2 已提交
376 377 378 379
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
380
```js
W
wangyongzhong2 已提交
381
import cryptoFramework from "@ohos.security.cryptoFramework"
X
xwb 已提交
382 383 384 385
function uint8ArrayToShowStr(uint8Array) {
  return Array.prototype.map
    .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
    .join('');
W
wangyongzhong2 已提交
386 387
}

X
xwb 已提交
388 389 390
let key;    // key为使用密钥生成器 生成的密钥,此处省略生成过程
let encodedKey = key.getEncoded();
console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data));
W
wangyongzhong2 已提交
391 392
```

X
xwb 已提交
393
## SymKey
W
wangyongzhong2 已提交
394

X
xwb 已提交
395
对称密钥,是[Key](#key)的子类,在对称加解密时需要将其对象传入[Cipher](#cipher)实例的[init()](#init-2)方法使用。<br/>对称密钥可以通过对称密钥生成器[SymKeyGenerator](#symkeygenerator)来生成。
W
wangyongzhong2 已提交
396

X
xwb 已提交
397
### clearMem
W
wangyongzhong2 已提交
398

X
xwb 已提交
399
clearMem(): void
W
wangyongzhong2 已提交
400

X
xwb 已提交
401
以同步方法,将系统底层内存中的的密钥内容清零。建议在不再使用对称密钥实例时,调用本函数,避免内存中密钥数据存留过久。
W
wangyongzhong2 已提交
402

X
xwb 已提交
403
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
404 405 406

**示例:**

X
xwb 已提交
407
```js
W
wangyongzhong2 已提交
408
import cryptoFramework from "@ohos.security.cryptoFramework"
X
xwb 已提交
409 410 411 412
function uint8ArrayToShowStr(uint8Array) {
  return Array.prototype.map
    .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
    .join('');
W
wangyongzhong2 已提交
413
}
X
xwb 已提交
414 415 416 417 418 419 420

let key;    // key为使用对称密钥生成器 生成的密钥,此处省略生成过程
let encodedKey = key.getEncoded();
console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data));    // 输出密钥内容
key.clearMem();
encodedKey = key.getEncoded();
console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data));    // 输出全零
W
wangyongzhong2 已提交
421 422
```

X
xwb 已提交
423
## PubKey
W
wangyongzhong2 已提交
424

X
xwb 已提交
425
公钥,是Key的子类,在非对称加解密、验签、密钥协商时需要将其对象作为输入使用。<br/>公钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
W
wangyongzhong2 已提交
426 427 428

### 属性

429
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
430

X
xwb 已提交
431 432 433 434
| 名称    | 类型   | 可读 | 可写 | 说明                         |
| ------- | ------ | ---- | ---- | ---------------------------- |
| format  | string | 是   | 否   | 密钥的格式。                 |
| algName | string | 是   | 否   | 密钥对应的算法名(含长度)。 |
W
wangyongzhong2 已提交
435

X
xwb 已提交
436
### getAsyKeySpec<sup>10+</sup>
W
wangyongzhong2 已提交
437

X
xwb 已提交
438
getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number
W
wangyongzhong2 已提交
439

X
xwb 已提交
440
以同步方法,获取密钥参数。
W
wangyongzhong2 已提交
441 442 443 444 445

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
446 447
| 参数名 | 类型                  | 必填 | 说明                 |
| ---- | --------------------- | ---- | -------------------- |
X
xwb 已提交
448
| item  | [AsyKeySpecItem](#asykeyspecitem10) | 是   | 指定的密钥参数。 |
X
xwb 已提交
449 450 451 452 453 454

**返回值:**

| 类型                        | 说明                              |
| --------------------------- | --------------------------------- |
| bigint\|string\|number | 用于查看密钥参数的具体内容。 |
W
wangyongzhong2 已提交
455 456 457 458 459

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
460 461
| 401 | invalid parameters. |
| 17620001 | memory error. |
W
wangyongzhong2 已提交
462 463 464 465
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
466 467 468 469 470
```js
let key; // key为公钥对象,此处省略生成过程
let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN);
console.info("ecc item --- p: " + p.toString(16));
```
W
wangyongzhong2 已提交
471

X
xwb 已提交
472
## PriKey
W
wangyongzhong2 已提交
473

X
xwb 已提交
474
私钥,是Key的子类,在非对称加解密、签名、密钥协商时需要将其作为输入使用。<br/>私钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
W
wangyongzhong2 已提交
475

X
xwb 已提交
476 477
### 属性

478
**系统能力:** SystemCapability.Security.CryptoFramework
X
xwb 已提交
479 480 481 482 483

| 名称    | 类型   | 可读 | 可写 | 说明                         |
| ------- | ------ | ---- | ---- | ---------------------------- |
| format  | string | 是   | 否   | 密钥的格式。                 |
| algName | string | 是   | 否   | 密钥对应的算法名(含长度)。 |
W
wangyongzhong2 已提交
484

X
xwb 已提交
485
### clearMem
W
wangyongzhong2 已提交
486

X
xwb 已提交
487
clearMem(): void
W
wangyongzhong2 已提交
488

X
xwb 已提交
489
以同步方法,将系统底层内存中的的密钥内容清零。
W
wangyongzhong2 已提交
490 491 492

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
493 494 495 496
**示例:**

```js
let key; // key为使用非对称密钥生成器生成的非对称密钥的私钥对象,此处省略生成过程
497
key.clearMem(); // 非对称密钥私钥clearMem会释放内部密钥结构体,clearMem后不支持getEncoded操作
X
xwb 已提交
498 499 500 501 502 503 504 505 506 507 508 509 510 511
```

### getAsyKeySpec<sup>10+</sup>

getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number

以同步方法,获取密钥参数。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名 | 类型                  | 必填 | 说明                 |
| ---- | --------------------- | ---- | -------------------- |
X
xwb 已提交
512
| item  | [AsyKeySpecItem](#asykeyspecitem10) | 是   | 指定的密钥参数类型。 |
W
wangyongzhong2 已提交
513 514 515

**返回值:**

X
xwb 已提交
516 517 518
| 类型                        | 说明                              |
| --------------------------- | --------------------------------- |
| bigint\|string\|number | 用于查看密钥参数的具体内容。 |
W
wangyongzhong2 已提交
519 520 521 522 523

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
524 525
| 401 | invalid parameters. |
| 17620001 | memory error. |
W
wangyongzhong2 已提交
526 527 528 529
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
530 531 532 533 534
```js
let key; // key为私钥对象,此处省略生成过程
let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN);
console.info("ecc item --- p: " + p.toString(16));
```
W
wangyongzhong2 已提交
535

X
xwb 已提交
536
## KeyPair
W
wangyongzhong2 已提交
537

X
xwb 已提交
538
非对称密钥对,包含:公钥与私钥。<br/>可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。
W
wangyongzhong2 已提交
539

X
xwb 已提交
540 541 542 543
> **说明:**
>
> KeyPair对象中的pubKey对象和priKey对象,作为KeyPair对象中的一个参数存在,当离开KeyPair对象作用域时,其内部对象可能被析构。<br/>
> 业务方使用时应持有KeyPair对象的引用,而非内部pubKey或priKey对象的引用。
W
wangyongzhong2 已提交
544

X
xwb 已提交
545
### 属性
W
wangyongzhong2 已提交
546 547 548

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
549 550 551 552
| 名称    | 类型   | 可读 | 可写 | 说明           |
| ------- | ------ | ---- | ---- | ------------ |
| priKey  | [PriKey](#prikey) | 是   | 否   | 私钥。      |
| pubKey | [PubKey](#pubkey) | 是   | 否   | 公钥。       |
W
wangyongzhong2 已提交
553 554


X
xwb 已提交
555
## cryptoFramework.createSymKeyGenerator
W
wangyongzhong2 已提交
556

X
xwb 已提交
557
createSymKeyGenerator(algName: string): SymKeyGenerator
W
wangyongzhong2 已提交
558

X
xwb 已提交
559
通过指定算法名称的字符串,获取相应的对称密钥生成器实例。<br/>支持的规格详见框架概述“[密钥生成规格](../../security/cryptoFramework-overview.md#密钥生成规格)”一节。
W
wangyongzhong2 已提交
560

X
xwb 已提交
561
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
562

X
xwb 已提交
563
**参数:**
W
wangyongzhong2 已提交
564

X
xwb 已提交
565 566 567
| 参数名  | 类型   | 必填 | 说明                                                         |
| ------- | ------ | ---- | ------------------------------------------------------------ |
| algName | string | 是   | 待生成对称密钥生成器的算法名称。<br/>具体取值详见框架概述“[密钥生成规格](../../security/cryptoFramework-overview.md#密钥生成规格)”一节中的“字符串参数”。 |
W
wangyongzhong2 已提交
568 569 570

**返回值:**

X
xwb 已提交
571 572 573
| 类型                                | 说明                       |
| ----------------------------------- | -------------------------- |
| [SymKeyGenerator](#symkeygenerator) | 返回对称密钥生成器的对象。 |
W
wangyongzhong2 已提交
574 575 576

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
577 578
| 401 | invalid parameters. |
| 801 | this operation is not supported. |
W
wangyongzhong2 已提交
579 580 581

**示例:**

X
xwb 已提交
582 583 584 585
```js
import cryptoFramework from '@ohos.security.cryptoFramework';
let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
```
W
wangyongzhong2 已提交
586

X
xwb 已提交
587
## SymKeyGenerator
W
wangyongzhong2 已提交
588

X
xwb 已提交
589
对称密钥生成器。<br/>在使用该类的方法前,需要先使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)方法构建一个symKeyGenerator实例。
W
wangyongzhong2 已提交
590

X
xwb 已提交
591 592 593 594 595 596 597 598 599
### 属性

**系统能力:** SystemCapability.Security.CryptoFramework

| 名称    | 类型   | 可读 | 可写 | 说明                           |
| ------- | ------ | ---- | ---- | ------------------------------ |
| algName | string | 是   | 否   | 对称密钥生成器指定的算法名称。 |

### generateSymKey
W
wangyongzhong2 已提交
600

X
xwb 已提交
601
generateSymKey(callback: AsyncCallback\<SymKey>): void
W
wangyongzhong2 已提交
602

X
xwb 已提交
603
异步获取对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。<br/>必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。<br/>目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
W
wangyongzhong2 已提交
604 605 606

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
607
**参数:**
W
wangyongzhong2 已提交
608

X
xwb 已提交
609 610 611
| 参数名     | 类型                              | 必填 | 说明                                                         |
| -------- | --------------------------------- | ---- | ------------------------------------------------------------ |
| callback | AsyncCallback\<[SymKey](#symkey)> | 是   | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 |
W
wangyongzhong2 已提交
612 613 614

**错误码:**

X
xwb 已提交
615 616 617
| 错误码ID | 错误信息      |
| -------- | ------------- |
| 17620001 | memory error. |
W
wangyongzhong2 已提交
618 619 620

**示例:**

X
xwb 已提交
621 622 623 624 625 626 627 628 629 630 631
```js
import cryptoFramework from '@ohos.security.cryptoFramework';
let symAlgName = '3DES192';
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
symKeyGenerator.generateSymKey((err, symKey) => {
  if (err) {
    console.error(`Generate symKey failed, ${err.code}, ${err.message}`);
  } else {
    console.info(`Generate symKey success, algName: ${symKey.algName}`);
  }
})
W
wangyongzhong2 已提交
632 633
```

X
xwb 已提交
634
### generateSymKey
W
wangyongzhong2 已提交
635

X
xwb 已提交
636
generateSymKey(): Promise\<SymKey>
W
wangyongzhong2 已提交
637

X
xwb 已提交
638
异步获取该对称密钥生成器随机生成的密钥,通过Promise获取结果。<br/>必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。<br/>目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
W
wangyongzhong2 已提交
639 640 641

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
642
**返回值:**
W
wangyongzhong2 已提交
643

X
xwb 已提交
644 645 646
| 类型                        | 说明                              |
| --------------------------- | --------------------------------- |
| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 |
W
wangyongzhong2 已提交
647 648 649

**错误码:**

X
xwb 已提交
650 651
| 错误码ID | 错误信息      |
| -------- | ------------- |
W
wangyongzhong2 已提交
652 653 654 655
| 17620001 | memory error. |

**示例:**

X
xwb 已提交
656 657 658 659 660 661 662 663 664 665
```js
import cryptoFramework from '@ohos.security.cryptoFramework';
let symAlgName = 'AES128';
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
symKeyGenerator.generateSymKey()
.then(symKey => {
  console.info(`Generate symKey success, algName: ${symKey.algName}`);
}, error => {
  console.error(`Generate symKey failed, ${error.code}, ${error.message}`);
})
W
wangyongzhong2 已提交
666 667
```

X
xwb 已提交
668
### convertKey
W
wangyongzhong2 已提交
669

X
xwb 已提交
670
convertKey(key: DataBlob, callback: AsyncCallback\<SymKey>): void
W
wangyongzhong2 已提交
671

X
xwb 已提交
672
异步根据指定数据生成对称密钥,通过注册回调函数获取结果。<br/>必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
W
wangyongzhong2 已提交
673 674 675 676 677

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
678 679 680 681
| 参数名     | 类型                              | 必填 | 说明                                                         |
| -------- | --------------------------------- | ---- | ------------------------------------------------------------ |
| key      | [DataBlob](#datablob)             | 是   | 指定的对称密钥材料。                                         |
| callback | AsyncCallback\<[SymKey](#symkey)> | 是   | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 |
W
wangyongzhong2 已提交
682 683 684

**错误码:**

X
xwb 已提交
685 686 687 688
| 错误码ID | 错误信息                                               |
| -------- | --------------------------------------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.                                       |
W
wangyongzhong2 已提交
689 690 691

**示例:**

X
xwb 已提交
692 693
```js
import cryptoFramework from '@ohos.security.cryptoFramework';
W
wangyongzhong2 已提交
694

X
xwb 已提交
695 696 697 698 699 700 701
function genKeyMaterialBlob() {
  let arr = [
    0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
    0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72];    // keyLen = 192 (24 bytes)
  let keyMaterial = new Uint8Array(arr);
  return {data: keyMaterial};
W
wangyongzhong2 已提交
702
}
X
xwb 已提交
703 704 705 706 707 708 709 710 711 712 713

let symAlgName = '3DES192';
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
let keyMaterialBlob = genKeyMaterialBlob();
symKeyGenerator.convertKey(keyMaterialBlob, (err, symKey) => {
  if (err) {
    console.error(`Convert symKey failed, ${err.code}, ${err.message}`);
  } else {
    console.info(`Convert symKey success, algName: ${symKey.algName}`);
  }
})
W
wangyongzhong2 已提交
714 715
```

X
xwb 已提交
716
### convertKey
W
wangyongzhong2 已提交
717

X
xwb 已提交
718
convertKey(key: DataBlob): Promise\<SymKey>
W
wangyongzhong2 已提交
719

X
xwb 已提交
720
异步根据指定数据生成对称密钥,通过Promise获取结果。<br/>必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
W
wangyongzhong2 已提交
721 722 723 724 725

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
726 727 728
| 参数名 | 类型                  | 必填 | 说明                 |
| ---- | --------------------- | ---- | -------------------- |
| key  | [DataBlob](#datablob) | 是   | 指定的密钥材料数据。 |
W
wangyongzhong2 已提交
729 730 731

**返回值:**

X
xwb 已提交
732 733 734
| 类型                        | 说明                              |
| --------------------------- | --------------------------------- |
| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 |
W
wangyongzhong2 已提交
735 736 737

**错误码:**

X
xwb 已提交
738 739 740 741
| 错误码ID | 错误信息                                          |
| -------- | --------------------------------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.                                |
W
wangyongzhong2 已提交
742

X
xwb 已提交
743
**示例:**
W
wangyongzhong2 已提交
744

X
xwb 已提交
745 746 747 748 749 750 751 752 753 754
```js
import cryptoFramework from '@ohos.security.cryptoFramework';

function genKeyMaterialBlob() {
  let arr = [
    0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
    0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72];    // keyLen = 192 (24 bytes)
  let keyMaterial = new Uint8Array(arr);
  return {data: keyMaterial};
W
wangyongzhong2 已提交
755 756
}

X
xwb 已提交
757 758 759 760 761 762 763 764 765
let symAlgName = '3DES192';
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
let keyMaterialBlob = genKeyMaterialBlob();
symKeyGenerator.convertKey(keyMaterialBlob)
.then(symKey => {
  console.info(`Convert symKey success, algName: ${symKey.algName}`);
}, error => {
  console.error(`Convert symKey failed, ${error.code}, ${error.message}`);
})
W
wangyongzhong2 已提交
766 767
```

X
xwb 已提交
768
## cryptoFramework.createAsyKeyGenerator
W
wangyongzhong2 已提交
769

X
xwb 已提交
770
createAsyKeyGenerator(algName: string): AsyKeyGenerator
W
wangyongzhong2 已提交
771

X
xwb 已提交
772
通过指定算法名称的字符串,获取相应的非对称密钥生成器实例。<br/>支持的规格详见框架概述“[密钥生成规格](../../security/cryptoFramework-overview.md#密钥生成规格)”一节。
W
wangyongzhong2 已提交
773 774 775

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
776 777 778 779 780 781 782 783 784 785 786
**参数:**

| 参数名  | 类型   | 必填 | 说明                             |
| ------- | ------ | ---- | -------------------------------- |
| algName | string | 是   | 待生成对称密钥生成器的算法名称。 |

**返回值:**

| 类型            | 说明                         |
| --------------- | ---------------------------- |
| [AsyKeyGenerator](#asykeygenerator) | 返回非对称密钥生成器的对象。 |
W
wangyongzhong2 已提交
787 788 789

**错误码:**

X
xwb 已提交
790 791 792
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters. |
793 794
| 801 | this operation is not supported. |
| 17620001 | memory error. |
W
wangyongzhong2 已提交
795 796 797

**示例:**

X
xwb 已提交
798
```js
W
wangyongzhong2 已提交
799 800
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
801
let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
W
wangyongzhong2 已提交
802 803
```

X
xwb 已提交
804
## AsyKeyGenerator
W
wangyongzhong2 已提交
805

X
xwb 已提交
806 807 808
非对称密钥生成器。在使用该类的方法前,需要先使用createAsyKeyGenerator()方法构建一个AsyKeyGenerator实例。

### 属性
W
wangyongzhong2 已提交
809 810 811

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
812 813 814
| 名称    | 类型   | 可读 | 可写 | 说明                             |
| ------- | ------ | ---- | ---- | -------------------------------- |
| algName | string | 是   | 否   | 非对称密钥生成器指定的算法名称。 |
W
wangyongzhong2 已提交
815

X
xwb 已提交
816
### generateKeyPair
W
wangyongzhong2 已提交
817

X
xwb 已提交
818
generateKeyPair(callback: AsyncCallback\<KeyPair>): void
W
wangyongzhong2 已提交
819

X
xwb 已提交
820
异步获取非对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。
W
wangyongzhong2 已提交
821 822 823

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
824
**参数:**
W
wangyongzhong2 已提交
825

X
xwb 已提交
826 827 828
| 参数名     | 类型                    | 必填 | 说明                           |
| -------- | ----------------------- | ---- | ------------------------------ |
| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
W
wangyongzhong2 已提交
829

X
xwb 已提交
830
**错误码:**
W
wangyongzhong2 已提交
831

X
xwb 已提交
832 833 834 835
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
836
| 17630001 | crypto operation error.          |
W
wangyongzhong2 已提交
837

X
xwb 已提交
838
**示例:**
W
wangyongzhong2 已提交
839

X
xwb 已提交
840
```js
X
xwb 已提交
841
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
842

X
xwb 已提交
843 844 845 846 847 848 849 850 851
let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
asyKeyGenerator.generateKeyPair((err, keyPair) => {
  if (err) {
    console.error("generateKeyPair: error.");
    return;
  }
  console.info("generateKeyPair: success.");
})
```
W
wangyongzhong2 已提交
852

X
xwb 已提交
853
### generateKeyPair
W
wangyongzhong2 已提交
854

X
xwb 已提交
855
generateKeyPair(): Promise\<KeyPair>
W
wangyongzhong2 已提交
856

X
xwb 已提交
857
异步获取该非对称密钥生成器随机生成的密钥,通过Promise获取结果。
W
wangyongzhong2 已提交
858

X
xwb 已提交
859
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
860

X
xwb 已提交
861
**返回值:**
W
wangyongzhong2 已提交
862

X
xwb 已提交
863 864 865
| 类型              | 说明                              |
| ----------------- | --------------------------------- |
| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
W
wangyongzhong2 已提交
866

X
xwb 已提交
867
**错误码:**
W
wangyongzhong2 已提交
868

X
xwb 已提交
869 870 871 872
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
873
| 17630001 | crypto operation error.          |
W
wangyongzhong2 已提交
874

X
xwb 已提交
875
**示例:**
W
wangyongzhong2 已提交
876

X
xwb 已提交
877
```js
X
xwb 已提交
878
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
879

X
xwb 已提交
880 881 882 883 884 885 886 887
let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
let keyGenPromise = asyKeyGenerator.generateKeyPair();
keyGenPromise.then( keyPair => {
  console.info("generateKeyPair success.");
}).catch(error => {
  console.error("generateKeyPair error.");
});
```
W
wangyongzhong2 已提交
888

X
xwb 已提交
889
### convertKey
W
wangyongzhong2 已提交
890

X
xwb 已提交
891
convertKey(pubKey: DataBlob, priKey: DataBlob, callback: AsyncCallback\<KeyPair\>): void
W
wangyongzhong2 已提交
892

X
xwb 已提交
893
异步获取指定数据生成非对称密钥,通过注册回调函数获取结果。详情请看下方**密钥转换说明**
W
wangyongzhong2 已提交
894

X
xwb 已提交
895
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
896

X
xwb 已提交
897
**参数:**
W
wangyongzhong2 已提交
898

X
xwb 已提交
899 900 901 902 903
| 参数名     | 类型       | 必填 | 说明                           |
| -------- | ----------- | ---- | ------------------------------ |
| pubKey   | [DataBlob](#datablob)     | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。        |
| priKey   | [DataBlob](#datablob)     | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。        |
| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
W
wangyongzhong2 已提交
904

X
xwb 已提交
905
**错误码:**
W
wangyongzhong2 已提交
906

X
xwb 已提交
907 908 909 910
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
911
| 17630001 | crypto operation error.          |
W
wangyongzhong2 已提交
912 913 914

**示例:**

X
xwb 已提交
915
```js
W
wangyongzhong2 已提交
916 917
import cryptoFramework from "@ohos.security.cryptoFramework"

918 919
let 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]);
let 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]);
X
xwb 已提交
920 921 922 923 924 925 926 927 928 929
let pubKeyBlob = { data: pubKeyArray }; // 公钥的密钥数据
let priKeyBlob = { data: priKeyArray }; // 私钥的密钥数据
let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => {
  if (err) {
    console.error("convertKey: error.");
    return;
  }
  console.info("convertKey: success.");
})
W
wangyongzhong2 已提交
930 931
```

X
xwb 已提交
932
### convertKey
W
wangyongzhong2 已提交
933

X
xwb 已提交
934
convertKey(pubKey: DataBlob, priKey: DataBlob): Promise\<KeyPair>
W
wangyongzhong2 已提交
935

X
xwb 已提交
936
异步获取指定数据生成非对称密钥,通过Promise获取结果。详情请看下方**密钥转换说明**
W
wangyongzhong2 已提交
937

X
xwb 已提交
938
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
939

X
xwb 已提交
940
**参数:**
W
wangyongzhong2 已提交
941

X
xwb 已提交
942 943 944 945
| 参数名   | 类型    | 必填 | 说明             |
| ------ | -------- | ---- | ---------------- |
| pubKey | DataBlob | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。 |
| priKey | DataBlob | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。 |
W
wangyongzhong2 已提交
946

X
xwb 已提交
947
**返回值:**
W
wangyongzhong2 已提交
948

X
xwb 已提交
949 950 951
| 类型              | 说明                              |
| ----------------- | --------------------------------- |
| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
W
wangyongzhong2 已提交
952

X
xwb 已提交
953
**错误码:**
W
wangyongzhong2 已提交
954

X
xwb 已提交
955 956 957 958
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
959
| 17630001 | crypto operation error.          |
W
wangyongzhong2 已提交
960

X
xwb 已提交
961
**示例:**
W
wangyongzhong2 已提交
962

X
xwb 已提交
963
```js
X
xwb 已提交
964
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
965

966 967
let 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]);
let 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]);
X
xwb 已提交
968 969 970 971 972 973 974 975 976 977
let pubKeyBlob = { data: pubKeyArray }; // 公钥的密钥数据
let priKeyBlob = { data: priKeyArray }; // 私钥的密钥数据
let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
let keyGenPromise = asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob);
keyGenPromise.then( keyPair => {
  console.info("convertKey success.");
}).catch(error => {
  console.error("convertKey error.");
});
```
W
wangyongzhong2 已提交
978

X
xwb 已提交
979
**密钥转换说明**
W
wangyongzhong2 已提交
980

X
xwb 已提交
981 982 983
1. 非对称密钥(RSA、ECC、DSA)的公钥和私钥调用getEncoded()方法后,分别返回X.509格式和PKCS#8格式的二进制数据,此数据可用于跨应用传输或持久化存储。
2. 当调用convertKey方法将外来二进制数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、DER编码格式,私钥应满足ASN.1语法、PKCS#8规范、DER编码格式。
3. convertKey方法中,公钥和密钥二进制数据非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。
W
wangyongzhong2 已提交
984

X
xwb 已提交
985
## cryptoFramework.createAsyKeyGeneratorBySpec<sup>10+</sup>
W
wangyongzhong2 已提交
986

X
xwb 已提交
987
createAsyKeyGeneratorBySpec(asyKeySpec: AsyKeySpec): AsyKeyGeneratorBySpec
W
wangyongzhong2 已提交
988

X
xwb 已提交
989
通过指定密钥参数,获取相应的非对称密钥生成器实例。<br/>支持的规格详见框架概述“[密钥生成规格](../../security/cryptoFramework-overview.md#密钥生成规格)”一节。
W
wangyongzhong2 已提交
990 991 992

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
993 994 995 996
**参数:**

| 参数名  | 类型   | 必填 | 说明                             |
| ------- | ------ | ---- | -------------------------------- |
X
xwb 已提交
997
| asyKeySpec | [AsyKeySpec](#asykeyspec10) | 是   | 密钥参数。非对称密钥生成器根据指定的这些参数生成公/私钥。 |
X
xwb 已提交
998

W
wangyongzhong2 已提交
999 1000
**返回值:**

X
xwb 已提交
1001 1002
| 类型                                            | 说明                       |
| ----------------------------------------------- | -------------------------- |
X
xwb 已提交
1003
| [AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10) | 返回非对称密钥生成器实例。 |
X
xwb 已提交
1004 1005 1006 1007 1008 1009 1010 1011

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters. |
| 801 | this operation is not supported. |
| 17620001 | memory error. |
W
wangyongzhong2 已提交
1012 1013 1014

**示例:**

X
xwb 已提交
1015
```js
X
xwb 已提交
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
import cryptoFramework from "@ohos.security.cryptoFramework"

// 设置DSA1024中公私钥都包含的公共参数
function genDsa1024CommonSpecBigE() {
  let dsaCommonSpec = {
    algName : "DSA",
    specType : cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC,
    p : BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"),
    q : BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"),
    g : BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"),
  }
  return dsaCommonSpec;
}
// 设置DSA1024中公私钥包含的全量参数
function genDsa1024KeyPairSpecBigE() {
  let dsaCommonSpec = genDsa1024CommonSpecBigE();
  let dsaKeyPairSpec = {
    algName : "DSA",
    specType : cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC,
    params : dsaCommonSpec,
    sk : BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"),
    pk : BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"),
  }
  return dsaKeyPairSpec;
W
wangyongzhong2 已提交
1040 1041
}

X
xwb 已提交
1042 1043
let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // JS输入采用大端写法,并使用正数
let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
W
wangyongzhong2 已提交
1044 1045
```

X
xwb 已提交
1046
## AsyKeyGeneratorBySpec<sup>10+</sup>
W
wangyongzhong2 已提交
1047

X
xwb 已提交
1048
非对称密钥生成器。在使用该类的方法前,需要先使用[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法构建一个AsyKeyGeneratorBySpec实例。
W
wangyongzhong2 已提交
1049 1050 1051

### 属性

X
xwb 已提交
1052
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
1053

X
xwb 已提交
1054 1055 1056
| 名称    | 类型   | 可读 | 可写 | 说明                       |
| ------- | ------ | ---- | ---- | -------------------------- |
| algName | string | 是   | 否   | 非对称密钥生成器的算法名。 |
W
wangyongzhong2 已提交
1057

X
xwb 已提交
1058
### generateKeyPair
W
wangyongzhong2 已提交
1059

X
xwb 已提交
1060
generateKeyPair(callback: AsyncCallback\<KeyPair>): void
W
wangyongzhong2 已提交
1061

X
xwb 已提交
1062
异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。当使用COMMON_PARAMS_SPEC类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用KEY_PAIR_SPEC类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。
W
wangyongzhong2 已提交
1063 1064 1065

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
1066
**参数:**
W
wangyongzhong2 已提交
1067

X
xwb 已提交
1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078
| 参数名     | 类型                    | 必填 | 说明                           |
| -------- | ----------------------- | ---- | ------------------------------ |
| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |

**错误码:**

| 错误码ID | 错误信息                |
| -------- | ----------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.           |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
1079 1080 1081

**示例:**

X
xwb 已提交
1082
```js
X
xwb 已提交
1083
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
1084

X
xwb 已提交
1085 1086
let asyKeyPairSpec; // asyKeyPairSpec为全量密钥参数,此处省略生成过程
let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
X
xwb 已提交
1087
asyKeyGeneratorBySpec.generateKeyPair((err, keyPair) => {
X
xwb 已提交
1088 1089 1090 1091 1092 1093
  if (err) {
    console.error("generateKeyPair: error.");
    return;
  }
  console.info("generateKeyPair: success.");
})
W
wangyongzhong2 已提交
1094 1095
```

X
xwb 已提交
1096
### generateKeyPair
W
wangyongzhong2 已提交
1097

X
xwb 已提交
1098
generateKeyPair(): Promise\<KeyPair>
W
wangyongzhong2 已提交
1099

X
xwb 已提交
1100
异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。当使用COMMON_PARAMS_SPEC类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用KEY_PAIR_SPEC类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。
W
wangyongzhong2 已提交
1101 1102 1103

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
1104
**返回值:**
W
wangyongzhong2 已提交
1105

X
xwb 已提交
1106 1107 1108
| 类型              | 说明                              |
| ----------------- | --------------------------------- |
| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
W
wangyongzhong2 已提交
1109

X
xwb 已提交
1110
**错误码:**
W
wangyongzhong2 已提交
1111

X
xwb 已提交
1112 1113 1114 1115 1116
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
1117

X
xwb 已提交
1118
**示例:**
W
wangyongzhong2 已提交
1119

X
xwb 已提交
1120
```js
X
xwb 已提交
1121
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
1122

X
xwb 已提交
1123 1124
let asyKeyPairSpec; // asyKeyPairSpec为全量密钥参数,此处省略生成过程
let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
X
xwb 已提交
1125
let keyGenPromise = asyKeyGeneratorBySpec.generateKeyPair();
X
xwb 已提交
1126 1127 1128 1129 1130 1131
keyGenPromise.then( keyPair => {
  console.info("generateKeyPair success.");
}).catch(error => {
  console.error("generateKeyPair error.");
});
```
W
wangyongzhong2 已提交
1132

X
xwb 已提交
1133
### generatePriKey
W
wangyongzhong2 已提交
1134

X
xwb 已提交
1135
generatePriKey(callback: AsyncCallback\<PriKey>): void
W
wangyongzhong2 已提交
1136

X
xwb 已提交
1137
异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。当使用PRIVATE_KEY_SPEC类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用KEY_PAIR_SPEC类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。
W
wangyongzhong2 已提交
1138 1139 1140 1141 1142

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1143 1144 1145
| 参数名     | 类型                    | 必填 | 说明                           |
| -------- | ----------------------- | ---- | ------------------------------ |
| callback | AsyncCallback\<[PriKey](#prikey)> | 是   | 回调函数,用于获取非对称密钥。 |
W
wangyongzhong2 已提交
1146

X
xwb 已提交
1147
**错误码:**
W
wangyongzhong2 已提交
1148

X
xwb 已提交
1149 1150 1151 1152 1153
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
1154 1155 1156

**示例:**

X
xwb 已提交
1157
```js
X
xwb 已提交
1158 1159 1160 1161
import cryptoFramework from "@ohos.security.cryptoFramework"

let asyKeyPairSpec; // asyKeyPairSpec为全量密钥参数
let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
X
xwb 已提交
1162
asyKeyGeneratorBySpec.generatePriKey((err, prikey) => {
X
xwb 已提交
1163 1164 1165 1166 1167 1168
  if (err) {
    console.error("generatePriKey: error.");
    return;
  }
  console.info("generatePriKey: success.");
})
W
wangyongzhong2 已提交
1169 1170
```

X
xwb 已提交
1171
### generatePriKey
W
wangyongzhong2 已提交
1172

X
xwb 已提交
1173
generatePriKey(): Promise\<PriKey>
W
wangyongzhong2 已提交
1174

X
xwb 已提交
1175
异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。当使用PRIVATE_KEY_SPEC类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用KEY_PAIR_SPEC类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。
W
wangyongzhong2 已提交
1176 1177 1178

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
1179
**返回值:**
W
wangyongzhong2 已提交
1180

X
xwb 已提交
1181 1182 1183
| 类型              | 说明                              |
| ----------------- | --------------------------------- |
| Promise\<[PriKey](#prikey)> | 使用Promise的方式获取非对称密钥。 |
W
wangyongzhong2 已提交
1184

X
xwb 已提交
1185
**错误码:**
W
wangyongzhong2 已提交
1186

X
xwb 已提交
1187 1188 1189 1190 1191 1192 1193 1194
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
1195
```js
X
xwb 已提交
1196 1197 1198 1199
import cryptoFramework from "@ohos.security.cryptoFramework"

let asyKeyPairSpec; // asyKeyPairSpec为全量密钥参数
let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
X
xwb 已提交
1200
let keyGenPromise = asyKeyGeneratorBySpec.generatePriKey();
X
xwb 已提交
1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212
keyGenPromise.then( priKey => {
  console.info("generatePriKey success.");
}).catch(error => {
  console.error("generatePriKey error.");
});
```

### generatePubKey

generatePubKey(callback: AsyncCallback\<PubKey>): void

异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。当使用PUBLIC_KEY_SPEC类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用KEY_PAIR_SPEC类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。
W
wangyongzhong2 已提交
1213 1214 1215 1216 1217

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1218 1219 1220
| 参数名     | 类型                    | 必填 | 说明                           |
| -------- | ----------------------- | ---- | ------------------------------ |
| callback | AsyncCallback\<[PubKey](#pubkey)> | 是   | 回调函数,用于获取非对称密钥。 |
W
wangyongzhong2 已提交
1221 1222 1223

**错误码:**

X
xwb 已提交
1224 1225 1226 1227 1228
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
1229 1230 1231

**示例:**

X
xwb 已提交
1232
```js
X
xwb 已提交
1233 1234 1235 1236
import cryptoFramework from "@ohos.security.cryptoFramework"

let asyKeyPairSpec; // asyKeyPairSpec为全量密钥参数,此处省略生成过程
let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
X
xwb 已提交
1237
asyKeyGeneratorBySpec.generateKeyPair((err, pubKey) => {
W
wangyongzhong2 已提交
1238
  if (err) {
X
xwb 已提交
1239 1240
    console.error("generatePubKey: error.");
    return;
W
wangyongzhong2 已提交
1241
  }
X
xwb 已提交
1242
  console.info("generatePubKey: success.");
W
wangyongzhong2 已提交
1243 1244 1245
})
```

X
xwb 已提交
1246
### generatePubKey
W
wangyongzhong2 已提交
1247

X
xwb 已提交
1248
generatePubKey(): Promise\<PubKey>
W
wangyongzhong2 已提交
1249

X
xwb 已提交
1250
异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。当使用PUBLIC_KEY_SPEC类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用KEY_PAIR_SPEC类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。
W
wangyongzhong2 已提交
1251 1252 1253 1254 1255

**系统能力:** SystemCapability.Security.CryptoFramework

**返回值:**

X
xwb 已提交
1256 1257 1258
| 类型              | 说明                              |
| ----------------- | --------------------------------- |
| Promise\<[PubKey](#pubkey)> | 使用Promise的方式获取非对称密钥。 |
W
wangyongzhong2 已提交
1259 1260 1261

**错误码:**

X
xwb 已提交
1262 1263 1264 1265 1266
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
1267 1268 1269

**示例:**

X
xwb 已提交
1270
```js
X
xwb 已提交
1271 1272 1273 1274
import cryptoFramework from "@ohos.security.cryptoFramework"

let asyKeyPairSpec; // asyKeyPairSpec为全量密钥参数,此处省略生成过程
let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
X
xwb 已提交
1275
let keyGenPromise = asyKeyGeneratorBySpec.generatePubKey();
X
xwb 已提交
1276 1277 1278 1279 1280
keyGenPromise.then( pubKey => {
  console.info("generatePubKey success.");
}).catch(error => {
  console.error("generatePubKey error.");
});
W
wangyongzhong2 已提交
1281 1282
```

X
xwb 已提交
1283
## cryptoFramework.createCipher
W
wangyongzhong2 已提交
1284

X
xwb 已提交
1285
createCipher(transformation: string): Cipher
W
wangyongzhong2 已提交
1286

X
xwb 已提交
1287
通过指定算法名称,获取相应的[Cipher](#cipher)实例。<br/>支持的规格详见框架概述“[加解密规格](../../security/cryptoFramework-overview.md#加解密规格)”一节。
W
wangyongzhong2 已提交
1288 1289 1290 1291 1292

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1293 1294 1295 1296
| 参数名         | 类型   | 必填 | 说明                                                         |
| -------------- | ------ | ---- | ------------------------------------------------------------ |
| transformation | string | 是   | 待生成Cipher的算法名称(含密钥长度)、加密模式以及填充方法的组合。<br/>具体取值详见框架概述“[加解密规格](../../security/cryptoFramework-overview.md#加解密规格)”一节中的“字符串参数”。 |

X
xwb 已提交
1297 1298
> **说明:**
>
X
xwb 已提交
1299
> 1. 目前对称加解密中,PKCS5和PKCS7的实现相同,其padding长度和分组长度保持一致(即PKCS5和PKCS7在3DES中均按照8字节填充,在AES中均按照16字节填充),另有NoPadding表示不填充。<br/>开发者需要自行了解密码学不同分组模式的差异,以便选择合适的参数规格。例如选择ECB和CBC模式时,建议启用填充,否则必须确保明文长度是分组大小的整数倍;选择其他模式时,可以不启用填充,此时密文长度和明文长度一致(即可能不是分组大小的整数倍)。
W
wutiantian_gitee 已提交
1300
> 2. 使用RSA、SM2进行非对称加解密时,必须创建两个Cipher对象分别进行加密和解密操作,而不能对同一个Cipher对象进行加解密。对称加解密没有此要求(即只要算法规格一样,可以对同一个Cipher对象进行加解密操作)。
X
xwb 已提交
1301 1302 1303 1304 1305 1306

**返回值:**

| 类型              | 说明                     |
| ----------------- | ------------------------ |
| [Cipher](#cipher) | 返回加解密生成器的对象。 |
W
wangyongzhong2 已提交
1307 1308 1309

**错误码:**

X
xwb 已提交
1310 1311 1312 1313
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 801 | this operation is not supported. |
1314
| 17620001 | memory error.          |
W
wangyongzhong2 已提交
1315 1316 1317

**示例:**

X
xwb 已提交
1318
```js
X
xwb 已提交
1319
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
1320

X
xwb 已提交
1321 1322 1323 1324 1325 1326 1327
let cipherAlgName = '3DES192|ECB|PKCS7';
var cipher;
try {
  cipher = cryptoFramework.createCipher(cipherAlgName);
  console.info(`cipher algName: ${cipher.algName}`);
} catch (error) {
  console.error(`createCipher failed, ${error.code}, ${error.message}`);
W
wangyongzhong2 已提交
1328
}
X
xwb 已提交
1329
```
W
wangyongzhong2 已提交
1330

X
xwb 已提交
1331
## Cipher
W
wangyongzhong2 已提交
1332

X
xwb 已提交
1333
提供加解密的算法操作功能,按序调用本类中的[init()](#init-2)[update()](#update-4)[doFinal()](#dofinal-2)方法,可以实现对称加密/对称解密/非对称加密/非对称解密。<br/>完整的加解密流程示例可参考开发指导中的“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”一节。
W
wangyongzhong2 已提交
1334

X
xwb 已提交
1335
一次完整的加/解密流程在对称加密和非对称加密中略有不同:
W
wangyongzhong2 已提交
1336

X
xwb 已提交
1337
- 对称加解密:init为必选,update为可选(且允许多次update加/解密大数据),doFinal为必选;doFinal结束后可以重新init开始新一轮加/解密流程。
W
wutiantian_gitee 已提交
1338
- RSA、SM2非对称加解密:init为必选,不支持update操作,doFinal为必选(允许连续多次doFinal加/解密大数据);RSA不支持重复init,切换加解密模式或填充方式时,需要重新创建Cipher对象。
X
xwb 已提交
1339 1340

### 属性
W
wangyongzhong2 已提交
1341 1342 1343 1344

**系统能力:** SystemCapability.Security.CryptoFramework


X
xwb 已提交
1345 1346 1347
| 名称    | 类型   | 可读 | 可写 | 说明                         |
| ------- | ------ | ---- | ---- | ---------------------------- |
| algName | string | 是   | 否   | 加解密生成器指定的算法名称。 |
W
wangyongzhong2 已提交
1348

X
xwb 已提交
1349
### init
W
wangyongzhong2 已提交
1350

X
xwb 已提交
1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364
init(opMode: CryptoMode, key: Key, params: ParamsSpec, callback: AsyncCallback\<void>): void

初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。<br/>必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名     | 类型                      | 必填 | 说明                                                         |
| -------- | ------------------------- | ---- | ------------------------------------------------------------ |
| opMode   | [CryptoMode](#cryptomode) | 是   | 加密或者解密模式。                                           |
| key      | [Key](#key)               | 是   | 指定加密或解密的密钥。                                       |
| params   | [ParamsSpec](#paramsspec) | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 |
| callback | AsyncCallback\<void>      | 是   | 回调函数。当初始化成功,err为undefined,否则为错误对象。     |
W
wangyongzhong2 已提交
1365 1366 1367

**错误码:**

X
xwb 已提交
1368 1369 1370 1371 1372 1373
| 错误码ID | 错误信息                                                 |
| -------- | --------------------------------------------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.                                            |
| 17620002 | runtime error.                                           |
| 17630001 | crypto operation error.|
W
wangyongzhong2 已提交
1374 1375 1376 1377 1378

**示例:**

```js
import cryptoFramework from '@ohos.security.cryptoFramework';
X
xwb 已提交
1379 1380
let symKey;     // 此处省略生成对称密钥的过程
let cipher;         // 此处省略生成cipher实例的过程
W
wangyongzhong2 已提交
1381

X
xwb 已提交
1382 1383 1384 1385 1386 1387 1388
cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null, (err, ) => {
  if (err) {
    console.error(`Failed to init cipher, ${err.code}, ${err.message}`);
  } else {
    console.info(`Init cipher success`);
    // 此处进行update等后续操作
  }
W
wangyongzhong2 已提交
1389 1390 1391
})
```

X
xwb 已提交
1392
### init
W
wangyongzhong2 已提交
1393

X
xwb 已提交
1394
init(opMode: CryptoMode, key: Key, params: ParamsSpec): Promise\<void>
W
wangyongzhong2 已提交
1395

X
xwb 已提交
1396
初始化加解密的cipher对象,通过Promise获取结果。<br/>必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
W
wangyongzhong2 已提交
1397 1398 1399 1400 1401

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1402 1403 1404 1405 1406
| 参数名   | 类型                      | 必填 | 说明                                                         |
| ------ | ------------------------- | ---- | ------------------------------------------------------------ |
| opMode | [CryptoMode](#cryptomode) | 是   | 加密或者解密模式。                                           |
| key    | [Key](#key)               | 是   | 指定加密或解密的密钥。                                       |
| params | [ParamsSpec](#paramsspec) | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 |
W
wangyongzhong2 已提交
1407 1408 1409

**返回值:**

X
xwb 已提交
1410 1411 1412
| 类型           | 说明                                   |
| -------------- | -------------------------------------- |
| Promise\<void> | Promise对象。无返回结果的Promise对象。 |
W
wangyongzhong2 已提交
1413

X
xwb 已提交
1414
**错误码:**
W
wangyongzhong2 已提交
1415

X
xwb 已提交
1416 1417 1418 1419 1420 1421
| 错误码ID | 错误信息                                          |
| -------- | ------------------------------------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.                                     |
| 17620002 | runtime error.                                    |
| 17630001 | crypto operation error.|
W
wangyongzhong2 已提交
1422

X
xwb 已提交
1423
**示例:**
W
wangyongzhong2 已提交
1424

X
xwb 已提交
1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436
```js
import cryptoFramework from '@ohos.security.cryptoFramework';
let symKey;     // 此处省略生成对称密钥的过程
let cipher;         // 此处省略生成cipher实例的过程
cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null)
.then(() => {
  console.info(`Init cipher success`);
  // 此处进行update等后续操作
}, error => {
  console.error(`Failed to init cipher, ${error.code}, ${error.message}`);
})
```
W
wangyongzhong2 已提交
1437

X
xwb 已提交
1438
### update
W
wangyongzhong2 已提交
1439

X
xwb 已提交
1440
update(data: DataBlob, callback: AsyncCallback\<DataBlob>): void
W
wangyongzhong2 已提交
1441

X
xwb 已提交
1442
分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。 <br/>必须在对[Cipher](#cipher)实例使用[init()](init-2)初始化后,才能使用本函数。
W
wangyongzhong2 已提交
1443

X
xwb 已提交
1444 1445
> **说明:**
>
X
xwb 已提交
1446
> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和[doFinal](#dofinal-2)结果产生影响。<br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。)
X
xwb 已提交
1447 1448 1449
> 2. 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[doFinal](#dofinal-2))或多次调用update。<br/>
>    算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,采用多次update的方式传入数据。<br/>
>    AES使用多次update操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
W
wutiantian_gitee 已提交
1450
> 3. RSA、SM2非对称加解密不支持update操作。
W
wangyongzhong2 已提交
1451 1452 1453 1454 1455

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1456 1457 1458 1459
| 参数名     | 类型                                  | 必填 | 说明                                                         |
| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
| data     | [DataBlob](#datablob)                 | 是   | 加密或者解密的数据。data不能为null,也不允许传入{data: Uint8Array(空) }。           |
| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。当更新加/解密数据成功,err为undefined,data为此次更新的加/解密结果DataBlob;否则为错误对象。 |
W
wangyongzhong2 已提交
1460 1461 1462

**错误码:**

X
xwb 已提交
1463 1464 1465 1466 1467 1468
| 错误码ID | 错误信息                                    |
| -------- | ------------------------------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.                               |
| 17620002 | runtime error.                              |
| 17630001 | crypto operation error.                     |
W
wangyongzhong2 已提交
1469 1470 1471

**示例:**

X
xwb 已提交
1472 1473
```js
import cryptoFramework from '@ohos.security.cryptoFramework';
W
wangyongzhong2 已提交
1474

X
xwb 已提交
1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486
function stringToUint8Array(str) {
  let arr = [];
  for (let i = 0, j = str.length; i < j; ++i) {
    arr.push(str.charCodeAt(i));
  }
  return new Uint8Array(arr);
}

let cipher;         // 此处省略生成cipher实例的过程
// 此处省略init()过程
let plainText = {data: stringToUint8Array('this is test!')};
cipher.update(plainText, (err, output) => {       // 加密过程举例
W
wangyongzhong2 已提交
1487
  if (err) {
X
xwb 已提交
1488 1489 1490 1491 1492 1493 1494
    console.error(`Failed to update cipher`);
  } else {
    console.info(`Update cipher success`);
    if (output != null) {
      // 拼接output.data到密文
    }
    // 此处进行doFinal等后续操作
W
wangyongzhong2 已提交
1495 1496 1497 1498
  }
})
```

X
xwb 已提交
1499
### update
W
wangyongzhong2 已提交
1500

X
xwb 已提交
1501
update(data: DataBlob): Promise\<DataBlob>
W
wangyongzhong2 已提交
1502

X
xwb 已提交
1503
分段更新加密或者解密数据操作,通过通过Promise获取加/解密数据。<br/>必须在对[Cipher](#cipher)实例使用[init()](init-2)初始化后,才能使用本函数。
W
wangyongzhong2 已提交
1504

X
xwb 已提交
1505 1506
> **说明:**
>
X
xwb 已提交
1507
> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和[doFinal](#dofinal-2)结果产生影响。<br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。)
X
xwb 已提交
1508 1509 1510
> 2. 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[doFinal](#dofinal-2))或多次调用update。<br/>
>    算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,可以采用多次update的方式传入数据。<br/>
>    AES使用多次update操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
W
wutiantian_gitee 已提交
1511
> 3. RSA、SM2非对称加解密不支持update操作。
W
wangyongzhong2 已提交
1512 1513 1514

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
1515 1516 1517 1518 1519 1520
**参数:**

| 参数名 | 类型                  | 必填 | 说明                 |
| ---- | --------------------- | ---- | -------------------- |
| data | [DataBlob](#datablob) | 是   | 加密或者解密的数据。data不能为null,也不允许传入{data: Uint8Array(空) }。 |

W
wangyongzhong2 已提交
1521 1522
**返回值:**

X
xwb 已提交
1523 1524 1525
| 类型                            | 说明                                             |
| ------------------------------- | ------------------------------------------------ |
| Promise\<[DataBlob](#datablob)> | Promise对象,返回此次更新的加/解密结果DataBlob。 |
W
wangyongzhong2 已提交
1526 1527 1528

**错误码:**

X
xwb 已提交
1529 1530 1531 1532 1533 1534
| 错误码ID | 错误信息                                     |
| -------- | -------------------------------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.                                |
| 17620002 | runtime error.                               |
| 17630001 | crypto operation error.                      |
W
wangyongzhong2 已提交
1535 1536 1537

**示例:**

X
xwb 已提交
1538 1539
```js
import cryptoFramework from '@ohos.security.cryptoFramework';
W
wangyongzhong2 已提交
1540

X
xwb 已提交
1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561
function stringToUint8Array(str) {
  let arr = [];
  for (let i = 0, j = str.length; i < j; ++i) {
    arr.push(str.charCodeAt(i));
  }
  return new Uint8Array(arr);
}

let cipher;         // 此处省略生成cipher实例的过程
// 此处省略init()过程
let plainText = {data: stringToUint8Array('this is test!')};
cipher.update(plainText)
.then((output) => {
  console.info(`Update cipher success.`);
  if (output != null) {
    // 拼接output.data到密文
  }
  // 此处进行doFinal等后续操作
}, error => {
  console.info(`Update cipher failed.`);
})
W
wangyongzhong2 已提交
1562 1563
```

X
xwb 已提交
1564
### doFinal
W
wangyongzhong2 已提交
1565

X
xwb 已提交
1566
doFinal(data: DataBlob, callback: AsyncCallback\<DataBlob>): void
W
wangyongzhong2 已提交
1567

X
xwb 已提交
1568
(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过注册回调函数获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用[update](#update-4)传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别:
W
wangyongzhong2 已提交
1569

X
xwb 已提交
1570 1571
- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。
W
wangyongzhong2 已提交
1572

W
wutiantian_gitee 已提交
1573
(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。
W
wangyongzhong2 已提交
1574

1575
> **说明:**
X
xwb 已提交
1576
>
X
xwb 已提交
1577 1578 1579
>  1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用[init()](init-2)并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。
>  2. 如果遇到解密失败,需检查加解密数据和[init](#init-2)时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。
>  3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。
W
wutiantian_gitee 已提交
1580
>  4. RSA、SM2非对称加解密时多次doFinal操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
W
wangyongzhong2 已提交
1581

X
xwb 已提交
1582
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
1583

X
xwb 已提交
1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598
**参数:**

| 参数名     | 类型                                  | 必填 | 说明                                                         |
| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
| data     | [DataBlob](#datablob)                 | 是   | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。       |
| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。当最终加/解密数据成功,err为undefined,data为剩余数据的加/解密结果DataBlob;否则为错误对象。 |

**错误码:**

| 错误码ID | 错误信息                |
| -------- | ----------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.           |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
1599 1600 1601

**示例:**

X
xwb 已提交
1602 1603 1604 1605 1606 1607 1608
```js
import cryptoFramework from '@ohos.security.cryptoFramework';

let cipher;         // 此处省略生成cipher实例的过程
let data;           // 此处省略准备待加密/解密数据的过程
// 此处省略init()和update()过程
cipher.doFinal(data, (err, output) => {
W
wangyongzhong2 已提交
1609
  if (err) {
X
xwb 已提交
1610 1611 1612 1613 1614 1615
    console.error(`Failed to finalize cipher, ${err.code}, ${err.message}`);
  } else {
    console.info(`Finalize cipher success`);
    if (output != null) {
      // 拼接output.data得到完整的明文/密文(及authTag)
    }
W
wangyongzhong2 已提交
1616 1617 1618 1619
  }
})
```

X
xwb 已提交
1620 1621 1622 1623 1624
### doFinal

doFinal(data: DataBlob): Promise\<DataBlob>

(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过Promise获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用[update](#update-4)传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别:
W
wangyongzhong2 已提交
1625

X
xwb 已提交
1626 1627 1628
- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。

W
wutiantian_gitee 已提交
1629
(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过Promise获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。
W
wangyongzhong2 已提交
1630

X
xwb 已提交
1631 1632
> **说明:**
>
X
xwb 已提交
1633 1634 1635
>  1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用[init()](init-2)并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。
>  2. 如果遇到解密失败,需检查加解密数据和[init](#init-2)时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。
>  3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。
W
wutiantian_gitee 已提交
1636
>  4. RSA、SM2非对称加解密时多次doFinal操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
W
wangyongzhong2 已提交
1637 1638 1639 1640 1641

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1642 1643 1644
| 参数名 | 类型                  | 必填 | 说明                 |
| ---- | --------------------- | ---- | -------------------- |
| data | [DataBlob](#datablob) | 是   | 加密或者解密的数据。data参数允许为null,但不允许传入{data: Uint8Array(空) }。 |
W
wangyongzhong2 已提交
1645 1646 1647

**返回值:**

X
xwb 已提交
1648 1649 1650
| 类型                            | 说明                                             |
| ------------------------------- | ------------------------------------------------ |
| Promise\<[DataBlob](#datablob)> | Promise对象,返回剩余数据的加/解密结果DataBlob。 |
W
wangyongzhong2 已提交
1651 1652 1653

**错误码:**

X
xwb 已提交
1654 1655 1656 1657 1658 1659
| 错误码ID | 错误信息                                     |
| -------- | -------------------------------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.                                |
| 17620002 | runtime error.                               |
| 17630001 | crypto operation error.                      |
W
wangyongzhong2 已提交
1660 1661 1662

**示例:**

X
xwb 已提交
1663 1664
```js
import cryptoFramework from '@ohos.security.cryptoFramework';
W
wangyongzhong2 已提交
1665

X
xwb 已提交
1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677
let cipher;         // 此处省略生成cipher实例的过程
let data;           // 此处省略准备待加密/解密数据的过程
// 此处省略init()和update()过程
cipher.doFinal(data)
.then(output => {
  console.info(`Finalize cipher success`);
    if (output != null) {
    // 拼接output.data得到完整的明文/密文(及authTag)
  }
}, error => {
  console.error(`Failed to finalize cipher, ${error.code}, ${error.message}`);
})
W
wangyongzhong2 已提交
1678 1679
```

X
xwb 已提交
1680
**使用RSA加密的callback完整示例:**
W
wangyongzhong2 已提交
1681

X
xwb 已提交
1682
```js
W
wangyongzhong2 已提交
1683 1684
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
1685 1686 1687 1688 1689 1690
function stringToUint8Array(str) {
  let arr = [];
  for (let i = 0, j = str.length; i < j; ++i) {
    arr.push(str.charCodeAt(i));
  }
  return new Uint8Array(arr);
W
wangyongzhong2 已提交
1691 1692
}

X
xwb 已提交
1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705
let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
rsaGenerator.generateKeyPair(function (err, keyPair) {
  let pubKey = keyPair.pubKey;
  cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null, function (err, data) {
    let plainText = "this is cipher text";
    let input = {data: stringToUint8Array(plainText) };
    cipher.doFinal(input, function (err, data) {
      AlertDialog.show({ message: "EncryptOutPut is " + data.data} );
    });
  });
});
```
W
wangyongzhong2 已提交
1706

X
xwb 已提交
1707
**使用RSA加密的promise完整示例:**
W
wangyongzhong2 已提交
1708

X
xwb 已提交
1709
```js
X
xwb 已提交
1710
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
1711

X
xwb 已提交
1712 1713 1714 1715 1716 1717 1718
function stringToUint8Array(str) {
  let arr = [];
  for (let i = 0, j = str.length; i < j; ++i) {
    arr.push(str.charCodeAt(i));
  }
  return new Uint8Array(arr);
}
W
wangyongzhong2 已提交
1719

X
xwb 已提交
1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733
let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
let keyGenPromise = rsaGenerator.generateKeyPair();
keyGenPromise.then(rsaKeyPair => {
  let pubKey = rsaKeyPair.pubKey;
  return cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null); // 传入私钥和DECRYPT_MODE可初始化解密模式
}).then(() => {
  let plainText = "this is cipher text";
  let input = { data: stringToUint8Array(plainText) };
  return cipher.doFinal(input);
}).then(dataBlob => {
  console.info("EncryptOutPut is " + dataBlob.data);
});
```
W
wangyongzhong2 已提交
1734

X
xwb 已提交
1735 1736
> **说明:**
>
X
xwb 已提交
1737
> 更多加解密流程的完整示例可参考开发指导中的“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”一节。
W
wangyongzhong2 已提交
1738

X
xwb 已提交
1739
### setCipherSpec<sup>10+</sup>
W
wangyongzhong2 已提交
1740

X
xwb 已提交
1741
setCipherSpec(itemType: CipherSpecItem, itemValue: Uint8Array): void
W
wangyongzhong2 已提交
1742

X
xwb 已提交
1743
设置加解密参数。常用的加解密参数可以直接通过[createCipher](#cryptoframeworkcreatecipher) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。
W
wangyongzhong2 已提交
1744 1745 1746 1747 1748

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1749 1750
| 参数名   | 类型                 | 必填 | 说明       |
| -------- | -------------------- | ---- | ---------- |
X
xwb 已提交
1751
| itemType     | [CipherSpecItem](#cipherspecitem10)           | 是   | 用于指定需要设置的加解密参数。 |
X
xwb 已提交
1752
| itemValue | Uint8Array | 是   | 用于指定加解密参数的具体值。 |
W
wangyongzhong2 已提交
1753 1754 1755

**错误码:**

X
xwb 已提交
1756 1757 1758 1759 1760 1761
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
1762 1763 1764

**示例:**

X
xwb 已提交
1765
```js
W
wangyongzhong2 已提交
1766 1767
import cryptoFramework from '@ohos.security.cryptoFramework';

X
xwb 已提交
1768 1769 1770
let cipher; // 此处省略生成Cipher实例的过程
let pSource = new Uint8Array([1,2,3,4]);
cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource);
W
wangyongzhong2 已提交
1771 1772
```

X
xwb 已提交
1773
### getCipherSpec<sup>10+</sup>
W
wangyongzhong2 已提交
1774

X
xwb 已提交
1775
getCipherSpec(itemType: CipherSpecItem): string | Uint8Array
W
wangyongzhong2 已提交
1776

X
xwb 已提交
1777
获取加解密参数。当前只支持RSA算法。
W
wangyongzhong2 已提交
1778 1779 1780 1781 1782

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1783 1784
| 参数名 | 类型     | 必填 | 说明       |
| ------ | -------- | ---- | ---------- |
X
xwb 已提交
1785
| itemType   | [CipherSpecItem](#cipherspecitem10) | 是   | 用于指定需要获取的加解密参数。 |
W
wangyongzhong2 已提交
1786 1787 1788

**返回值:**

X
xwb 已提交
1789 1790 1791
| 类型           | 说明        |
| -------------- | ----------- |
| string\|Uint8Array | 获取的加解密参数的具体值。 |
W
wangyongzhong2 已提交
1792 1793 1794

**错误码:**

X
xwb 已提交
1795 1796 1797 1798 1799 1800
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
1801 1802 1803

**示例:**

X
xwb 已提交
1804
```js
W
wangyongzhong2 已提交
1805 1806
import cryptoFramework from '@ohos.security.cryptoFramework';

X
xwb 已提交
1807
let cipher; // 此处省略生成Cipher实例的过程
X
xwb 已提交
1808
let mdName = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR);
X
xwb 已提交
1809
```
W
wangyongzhong2 已提交
1810

X
xwb 已提交
1811
## cryptoFramework.createSign
W
wangyongzhong2 已提交
1812

X
xwb 已提交
1813
createSign(algName: string): Sign
W
wangyongzhong2 已提交
1814

X
xwb 已提交
1815
Sign实例生成。<br/>支持的规格详见框架概述“[签名验签规格](../../security/cryptoFramework-overview.md#签名验签规格)”一节。
W
wangyongzhong2 已提交
1816 1817 1818 1819 1820

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1821 1822
| 参数名  | 类型   | 必填 | 说明                                                         |
| ------- | ------ | ---- | ------------------------------------------------------------ |
W
wutiantian_gitee 已提交
1823
| algName | string | 是   | 指定签名算法:RSA,ECC,DSA或SM2<sup>10+</sup>。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。 |
X
xwb 已提交
1824 1825 1826 1827 1828 1829

**返回值**

| 类型 | 说明                               |
| ---- | ---------------------------------- |
| Sign | 返回由输入算法指定生成的Sign对象。 |
W
wangyongzhong2 已提交
1830 1831 1832

**错误码:**

X
xwb 已提交
1833 1834 1835
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
1836 1837
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
W
wangyongzhong2 已提交
1838 1839 1840

**示例:**

X
xwb 已提交
1841
```js
X
xwb 已提交
1842
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
1843

X
xwb 已提交
1844
let signer1 = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
W
wangyongzhong2 已提交
1845

1846
let signer2 = cryptoFramework.createSign("RSA1024|PSS|SHA256|MGF1_SHA256");
X
xwb 已提交
1847

1848
let signer3 = cryptoFramework.createSign("ECC224|SHA256");
X
xwb 已提交
1849

1850
let signer4 = cryptoFramework.createSign("DSA2048|SHA256");
W
wangyongzhong2 已提交
1851 1852
```

X
xwb 已提交
1853 1854
## Sign

X
xwb 已提交
1855 1856 1857
Sign类,使用Sign方法之前需要创建该类的实例进行操作,通过createSign(algName: string): Sign方法构造此实例。按序调用本类中的init、update、sign方法完成签名操作。签名操作的示例代码详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。

Sign类不支持重复初始化,当业务方需要使用新密钥签名时,需要重新创建新Sign对象并调用init初始化。
X
xwb 已提交
1858 1859 1860

业务方使用时,在createSign时确定签名的模式,调用init接口设置密钥。

X
xwb 已提交
1861
当待签名数据较短时,可在init初始化后,(无需update)直接调用sign接口传入原文数据进行签名。
X
xwb 已提交
1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927

当待签名数据较长时,可通过update接口分段传入切分后的原文数据,最后调用sign接口对整体原文数据进行签名。

当使用update分段传入原文时,sign接口支持传null,业务方可在循环中调用update接口,循环结束后调用sign进行签名。

### 属性

**系统能力:** SystemCapability.Security.CryptoFramework

| 名称    | 类型   | 可读 | 可写 | 说明                         |
| ------- | ------ | ---- | ---- | ---------------------------- |
| algName | string | 是   | 否   | 签名指定的算法名称。 |

### init

init(priKey: PriKey, callback: AsyncCallback\<void>): void

使用私钥初始化Sign对象,Callback形式,Sign类暂不支持重复init。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名   | 类型                 | 必填 | 说明             |
| -------- | -------------------- | ---- | ---------------- |
| priKey   | [PriKey](#prikey)    | 是   | 用于Sign的初始化。 |
| callback | AsyncCallback\<void> | 是   | 回调函数。      |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### init

init(priKey: PriKey): Promise\<void>

使用私钥初始化Sign对象,Promise形式,Sign类暂不支持重复init。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名 | 类型 | 必填 | 说明             |
| ------ | ---- | ---- | ---------------- |
| priKey | [PriKey](#prikey)  | 是   | 用于Sign的初始化。 |

**返回值:**

| 类型           | 说明          |
| -------------- | ------------- |
| Promise\<void> | Promise对象。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

W
wangyongzhong2 已提交
1928 1929
### update

X
xwb 已提交
1930
update(data: DataBlob, callback: AsyncCallback\<void>): void
W
wangyongzhong2 已提交
1931

X
xwb 已提交
1932
追加待签名数据,通过注册回调函数完成更新。 <br/>必须在对[Sign](#sign)实例使用[init()](#init-2)初始化后,才能使用本函数。
W
wangyongzhong2 已提交
1933

X
xwb 已提交
1934 1935 1936 1937 1938
> **说明:**
>
> 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[sign](#sign-1))或多次调用update。<br/>
> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
> 签名使用多次update操作的示例代码详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
W
wangyongzhong2 已提交
1939 1940 1941 1942 1943

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961
| 参数名   | 类型                  | 必填 | 说明         |
| -------- | --------------------- | ---- | ------------ |
| data     | [DataBlob](#datablob) | 是   | 传入的消息。 |
| callback | AsyncCallback\<void>  | 是   | 回调函数。   |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### update

update(data: DataBlob): Promise\<void>

X
xwb 已提交
1962
追加待签名数据,通过promise方式完成更新。 <br/>必须在对[Sign](#sign)实例使用[init()](#init-3)初始化后,才能使用本函数。
X
xwb 已提交
1963

X
xwb 已提交
1964 1965 1966 1967 1968
> **说明:**
>
> 根据数据量,可以不调用update(即[init](#init-3)完成后直接调用[sign](#sign-2))或多次调用update。<br/>
> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
> 签名使用多次update操作的示例代码详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
X
xwb 已提交
1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名 | 类型     | 必填 | 说明       |
| ------ | -------- | ---- | ---------- |
| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |

**返回值:**

| 类型           | 说明          |
| -------------- | ------------- |
| Promise\<void> | Promise对象。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### sign

sign(data: DataBlob, callback: AsyncCallback\<DataBlob>): void

X
xwb 已提交
1997
对数据进行签名,通过注册回调函数获取签名结果。
X
xwb 已提交
1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名   | 类型                 | 必填 | 说明       |
| -------- | -------------------- | ---- | ---------- |
| data     | [DataBlob](#datablob)              | 是   | 传入的消息。 |
| callback | AsyncCallback\<[DataBlob](#datablob) > | 是   | 回调函数。  |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### sign

sign(data: DataBlob): Promise\<DataBlob>

X
xwb 已提交
2021
对数据进行签名,通过promise方式返回签名结果。
X
xwb 已提交
2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名 | 类型     | 必填 | 说明       |
| ------ | -------- | ---- | ---------- |
| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |

**返回值:**

| 类型           | 说明          |
| -------------- | ------------- |
| Promise\<void> | Promise对象。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

**callback示例:**

X
xwb 已提交
2048
```js
X
xwb 已提交
2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072
import cryptoFramework from "@ohos.security.cryptoFramework"

function stringToUint8Array(str) {
  var arr = [];
  for (var i = 0, j = str.length; i < j; ++i) {
    arr.push(str.charCodeAt(i));
  }
  var tmpArray = new Uint8Array(arr);
  return tmpArray;
}

let globalKeyPair;
let SignMessageBlob;
let plan1 = "This is Sign test plan1"; // The first segment of data.
let plan2 = "This is Sign test plan2"; // The second segment of fata.
let input1 = { data: stringToUint8Array(plan1) };
let input2 = { data: stringToUint8Array(plan2) };

function signMessageCallback() {
  let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
  let signer = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
  rsaGenerator.generateKeyPair(function (err, keyPair) {
    globalKeyPair = keyPair;
    let priKey = globalKeyPair.priKey;
2073 2074
    signer.init(priKey, err => {
      signer.update(input1, err => { // add first segment of data
X
xwb 已提交
2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086
        signer.sign(input2, function (err, data) { // add second segment of data, sign input1 and input2
          SignMessageBlob = data;
          AlertDialog.show({message: "res" +  SignMessageBlob.data});
        });
      });
    });
  });
}
```

**promise示例:**

X
xwb 已提交
2087
```js
X
xwb 已提交
2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129
import cryptoFramework from "@ohos.security.cryptoFramework"

function stringToUint8Array(str) {
  var arr = [];
  for (var i = 0, j = str.length; i < j; ++i) {
    arr.push(str.charCodeAt(i));
  }
  var tmpArray = new Uint8Array(arr);
  return tmpArray;
}

let globalKeyPair;
let SignMessageBlob;
let plan1 = "This is Sign test plan1"; // The first segment of data.
let plan2 = "This is Sign test plan2"; // The second segment of fata.
let input1 = { data: stringToUint8Array(plan1) };
let input2 = { data: stringToUint8Array(plan2) };

function signMessagePromise() {
  let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
  let signer = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
  let keyGenPromise = rsaGenerator.generateKeyPair();
  keyGenPromise.then( keyPair => {
    globalKeyPair = keyPair;
    let priKey = globalKeyPair.priKey;
    return signer.init(priKey);
  }).then(() => {
    return signer.update(input1); // add first segment of data
  }).then(() => {
    return signer.sign(input2); // add second segment of data, sign input1 and input2
  }).then(dataBlob => {
    SignMessageBlob = dataBlob;
    console.info("sign output is " + SignMessageBlob.data);
    AlertDialog.show({message: "output" +  SignMessageBlob.data});
  });
}
```

### setSignSpec<sup>10+</sup>

setSignSpec(itemType: SignSpecItem, itemValue: number): void

X
xwb 已提交
2130
设置签名参数。常用的签名参数可以直接通过[createSign](#cryptoframeworkcreatesign) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。
X
xwb 已提交
2131 2132 2133 2134 2135 2136 2137

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名   | 类型                 | 必填 | 说明       |
| -------- | -------------------- | ---- | ---------- |
X
xwb 已提交
2138
| itemType     | [SignSpecItem](#signspecitem10)              | 是   | 用于指定需要设置的签名参数。 |
X
xwb 已提交
2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151
| itemValue | number | 是   | 用于指定签名参数的具体值。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
2152
```js
X
xwb 已提交
2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163
import cryptoFramework from "@ohos.security.cryptoFramework"

let signer; // 此处省略生成Sign实例的过程
let setN = 20;
signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN);
```

### getSignSpec<sup>10+</sup>

getSignSpec(itemType: SignSpecItem): string | number

X
xwb 已提交
2164
获取签名参数。当前只支持RSA算法。
X
xwb 已提交
2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名 | 类型     | 必填 | 说明       |
| ------ | -------- | ---- | ---------- |
| itemType | [SignSpecItem](#signspecitem)  | 是   | 用于指定需要获取的签名参数。 |

**返回值:**

| 类型           | 说明        |
| -------------- | ----------- |
| string\|number | 获取的签名参数的具体值。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
2191
```js
X
xwb 已提交
2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209
import cryptoFramework from "@ohos.security.cryptoFramework"

let signer; // 此处省略生成Sign实例的过程
let saltLen = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM);
```

## cryptoFramework.createVerify

createVerify(algName: string): Verify

Verify实例生成。<br/>支持的规格详见框架概述“[签名验签规格](../../security/cryptoFramework-overview.md#签名验签规格)”一节。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名  | 类型   | 必填 | 说明                                                         |
| ------- | ------ | ---- | ------------------------------------------------------------ |
W
wutiantian_gitee 已提交
2210
| algName | string | 是   | 指定签名算法:RSA,ECC,DSA或SM2<sup>10+</sup>,。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。 |
X
xwb 已提交
2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222

**返回值**

| 类型   | 说明                                 |
| ------ | ------------------------------------ |
| Verify | 返回由输入算法指定生成的Verify对象。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
2223 2224
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
X
xwb 已提交
2225 2226 2227

**示例:**

X
xwb 已提交
2228
```js
X
xwb 已提交
2229 2230 2231 2232 2233 2234 2235 2236 2237
import cryptoFramework from "@ohos.security.cryptoFramework"

let verifyer1 = cryptoFramework.createVerify("RSA1024|PKCS1|SHA256");

let verifyer2 = cryptoFramework.createVerify("RSA1024|PSS|SHA256|MGF1_SHA256")
```

## Verify

X
xwb 已提交
2238
Verify类,使用Verify方法之前需要创建该类的实例进行操作,通过createVerify(algName: string): Verify方法构造此实例。按序调用本类中的init、update、verify方法完成签名操作。验签操作的示例代码详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
X
xwb 已提交
2239 2240 2241 2242 2243

Verify类不支持重复初始化,当业务方需要使用新密钥验签时,需要重新创建新Verify对象并调用init初始化。

业务方使用时,在createVerify时确定验签的模式,调用init接口设置密钥。

X
xwb 已提交
2244
当被签名的消息较短时,可在init初始化后,(无需update)直接调用verify接口传入被签名的消息和签名(signatureData)进行验签。
X
xwb 已提交
2245

X
xwb 已提交
2246
当被签名的消息较长时,可通过update接口分段传入被签名的消息,最后调用verify接口对消息全文进行验签。verify接口的data入参支持传null,业务方可在循环中调用update接口,循环结束后调用verify传入签名(signatureData)进行验签。
X
xwb 已提交
2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312

### 属性

**系统能力:** SystemCapability.Security.CryptoFramework

| 名称    | 类型   | 可读 | 可写 | 说明                         |
| ------- | ------ | ---- | ---- | ---------------------------- |
| algName | string | 是   | 否   | 验签指定的算法名称。 |

### init

init(pubKey: PubKey, callback: AsyncCallback\<void>): void

传入公钥初始化Verify对象,Callback形式

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名   | 类型                 | 必填 | 说明                           |
| -------- | -------------------- | ---- | ------------------------------ |
| pubKey   | [PubKey](#pubkey)    | 是   | 公钥对象,用于Verify的初始化。 |
| callback | AsyncCallback\<void> | 是   | 回调函数。                     |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### init

init(pubKey: PubKey): Promise\<void>

传入公钥初始化Verify对象,Promise形式。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名 | 类型 | 必填 | 说明                         |
| ------ | ---- | ---- | ---------------------------- |
| pubKey | [PubKey](#pubkey)  | 是   | 公钥对象,用于Verify的初始化。 |

**返回值:**

| 类型           | 说明          |
| -------------- | ------------- |
| Promise\<void> | Promise对象。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### update

update(data: DataBlob, callback: AsyncCallback\<void>): void

X
xwb 已提交
2313
追加待验签数据,通过注册回调函数完成更新。 <br/>必须在对[Verify](#verify)实例使用[init()](#init-4)初始化后,才能使用本函数。
X
xwb 已提交
2314

X
xwb 已提交
2315 2316 2317 2318 2319
> **说明:**
>
> 根据数据量,可以不调用update(即[init](#init-4)完成后直接调用[verify](#verify-1))或多次调用update。<br/>
> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
> 验签使用多次update操作的示例代码详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
X
xwb 已提交
2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名   | 类型                  | 必填 | 说明         |
| -------- | --------------------- | ---- | ------------ |
| data     | [DataBlob](#datablob) | 是   | 传入的消息。 |
| callback | AsyncCallback\<void>  | 是   | 回调函数。   |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### update

update(data: DataBlob): Promise\<void>

X
xwb 已提交
2343
追加待验签数据,通过Promise方式完成更新。 <br/>必须在对[Verify](#verify)实例使用[init()](#init-5)初始化后,才能使用本函数。
X
xwb 已提交
2344

X
xwb 已提交
2345 2346 2347 2348 2349
> **说明:**
>
> 根据数据量,可以不调用update(即[init](#init-5)完成后直接调用[verify](#verify-2))或多次调用update。<br/>
> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
> 验签使用多次update操作的示例代码详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
X
xwb 已提交
2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名 | 类型     | 必填 | 说明       |
| ------ | -------- | ---- | ---------- |
| data   | [DataBlob](#datablob)  | 是   | 传入的消息。 |

**返回值:**

| 类型           | 说明          |
| -------------- | ------------- |
| Promise\<void> | Promise对象。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### verify

verify(data: DataBlob, signatureData: DataBlob, callback: AsyncCallback\<boolean>): void

对数据进行验签,返回验签结果,callback方式。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名        | 类型                 | 必填 | 说明       |
| ------------- | -------------------- | ---- | ---------- |
| data          | [DataBlob](#datablob)              | 是   | 传入的消息。 |
| signatureData | [DataBlob](#datablob)              | 是   | 签名数据。  |
| callback      | AsyncCallback\<boolean> | 是   | 回调函数。  |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

### verify

verify(data: DataBlob, signatureData: DataBlob): Promise\<boolean>

对数据进行验签,返回验签结果,promise方式。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名        | 类型     | 必填 | 说明       |
| ------------- | -------- | ---- | ---------- |
| data          | [DataBlob](#datablob)  | 是   | 传入的消息。 |
| signatureData | [DataBlob](#datablob)  | 是   | 签名数据。  |

**返回值:**

| 类型              | 说明                           |
| ----------------- | ------------------------------ |
| Promise\<boolean> | 异步返回值,代表验签是否通过。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

**callback示例:**

X
xwb 已提交
2431
```js
X
xwb 已提交
2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449
import cryptoFramework from "@ohos.security.cryptoFramework"

let globalKeyPair; // globalKeyPair为使用非对称密钥生成器生成的非对称密钥对象,此处省略生成过程
let input1 = null;
let input2 = null;
let signMessageBlob = null; // 签名后的数据,此处省略
let verifyer = cryptoFramework.createVerify("RSA1024|PKCS1|SHA25");
verifyer.init(globalKeyPair.pubKey, function (err, data) {
  verifyer.update(input1, function(err, data) {
    verifyer.verify(input2, signMessageBlob, function(err, data) {
      console.info("verify result is " + data);
    })
  });
})
```

**promise示例:**

X
xwb 已提交
2450
```js
X
xwb 已提交
2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471
import cryptoFramework from "@ohos.security.cryptoFramework"

let globalKeyPair; // globalKeyPair为使用非对称密钥生成器生成的非对称密钥对象,此处省略生成过程
let verifyer = cryptoFramework.createVerify("RSA1024|PKCS1|SHA256");
let verifyInitPromise = verifyer.init(globalKeyPair.pubKey);
let input1 = null;
let input2 = null;
let signMessageBlob = null; // 签名后的数据,此处省略
verifyInitPromise.then(() => {
  return verifyer.update(input1);
}).then(() => {
  return verifyer.verify(input2, signMessageBlob);
}).then(res => {
  console.log("Verify result is " + res);
});
```

### setVerifySpec<sup>10+</sup>

setVerifySpec(itemType: SignSpecItem, itemValue: number): void

X
xwb 已提交
2472 2473 2474
设置验签参数。常用的签名参数可以直接通过[createVerify](#cryptoframeworkcreateverify) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。

验签的参数应当与签名的参数保持一致。
X
xwb 已提交
2475 2476 2477 2478 2479 2480 2481

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名   | 类型                 | 必填 | 说明       |
| -------- | -------------------- | ---- | ---------- |
X
xwb 已提交
2482
| itemType     | [SignSpecItem](#signspecitem10)              | 是   | 用于指定需要设置的验签参数。 |
X
xwb 已提交
2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495
| itemValue | number | 是   | 用于指定验签参数的具体值。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
2496
```js
X
xwb 已提交
2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507
import cryptoFramework from "@ohos.security.cryptoFramework"

let verifyer; // 此处省略生成Verify实例的过程
let setN = 20;
verifyer.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN);
```

### getVerifySpec<sup>10+</sup>

getVerifySpec(itemType: SignSpecItem): string | number

X
xwb 已提交
2508 2509 2510 2511
获取验签参数。当前只支持RSA算法。

验签的参数应当与签名的参数保持一致。

X
xwb 已提交
2512 2513 2514 2515 2516 2517
**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名 | 类型     | 必填 | 说明       |
| ------ | -------- | ---- | ---------- |
X
xwb 已提交
2518
| itemType   | [SignSpecItem](#signspecitem10)  | 是   | 用于指定需要获取的验签参数。 |
X
xwb 已提交
2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536

**返回值:**

| 类型           | 说明        |
| -------------- | ----------- |
| string\|number | 获取的验签参数的具体值。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
2537
```js
X
xwb 已提交
2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556
import cryptoFramework from "@ohos.security.cryptoFramework"

let verifyer; // 此处省略生成Verify实例的过程
let saltLen = verifyer.getSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM);
```

## cryptoFramework.createKeyAgreement

createKeyAgreement(algName: string): KeyAgreement

KeyAgreement实例生成。<br/>支持的规格详见框架概述“[密钥协商规格](../../security/cryptoFramework-overview.md#密钥协商规格)”一节。

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名  | 类型   | 必填 | 说明                              |
| ------- | ------ | ---- | --------------------------------- |
| algName | string | 是   | 指定密钥协商算法:目前仅支持ECC。 |
W
wangyongzhong2 已提交
2557

X
xwb 已提交
2558
**返回值**
W
wangyongzhong2 已提交
2559

X
xwb 已提交
2560 2561 2562
| 类型         | 说明                                       |
| ------------ | ------------------------------------------ |
| KeyAgreement | 返回由输入算法指定生成的KeyAgreement对象。 |
W
wangyongzhong2 已提交
2563 2564 2565

**错误码:**

X
xwb 已提交
2566 2567 2568
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
2569 2570
| 801 | this operation is not supported.          |
| 17620001 | memory error.          |
W
wangyongzhong2 已提交
2571 2572 2573

**示例:**

X
xwb 已提交
2574
```js
X
xwb 已提交
2575
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
2576

X
xwb 已提交
2577
let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");
W
wangyongzhong2 已提交
2578 2579 2580

```

X
xwb 已提交
2581
## KeyAgreement
W
wangyongzhong2 已提交
2582

X
xwb 已提交
2583
KeyAgreement类,使用密钥协商方法之前需要创建该类的实例进行操作,通过createKeyAgreement(algName: string): KeyAgreement方法构造此实例。
W
wangyongzhong2 已提交
2584

X
xwb 已提交
2585
### 属性
W
wangyongzhong2 已提交
2586

X
xwb 已提交
2587
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
2588

X
xwb 已提交
2589 2590 2591
| 名称    | 类型   | 可读 | 可写 | 说明                         |
| ------- | ------ | ---- | ---- | ---------------------------- |
| algName | string | 是   | 否   | 密钥协商指定的算法名称。 |
W
wangyongzhong2 已提交
2592

X
xwb 已提交
2593 2594 2595 2596 2597
### generateSecret

generateSecret(priKey: PriKey, pubKey: PubKey, callback: AsyncCallback\<DataBlob>): void

基于传入的私钥与公钥进行密钥协商,返回共享秘密,Callback形式。
W
wangyongzhong2 已提交
2598 2599 2600 2601 2602

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
2603 2604 2605 2606 2607
| 参数名   | 类型                     | 必填 | 说明                   |
| -------- | ------------------------ | ---- | ---------------------- |
| priKey   | [PriKey](#prikey)        | 是   | 设置密钥协商的私钥输入。 |
| pubKey   | [PubKey](#pubkey)        | 是   | 设置密钥协商的公钥输入。 |
| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 异步接受共享秘密的回调。 |
W
wangyongzhong2 已提交
2608 2609 2610

**错误码:**

X
xwb 已提交
2611 2612 2613 2614
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
W
wangyongzhong2 已提交
2615 2616 2617
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |

X
xwb 已提交
2618
### generateSecret
W
wangyongzhong2 已提交
2619

X
xwb 已提交
2620
generateSecret(priKey: PriKey, pubKey: PubKey): Promise\<DataBlob>
W
wangyongzhong2 已提交
2621

X
xwb 已提交
2622
基于传入的私钥与公钥进行密钥协商,返回共享秘密,Promise形式。
W
wangyongzhong2 已提交
2623 2624 2625 2626 2627

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
2628 2629 2630 2631
| 参数名 | 类型   | 必填 | 说明                   |
| ------ | ------ | ---- | ---------------------- |
| priKey | [PriKey](#prikey) | 是   | 设置密钥协商的私钥输入。 |
| pubKey | [PubKey](#pubkey) | 是   | 设置密钥协商的公钥输入。 |
W
wangyongzhong2 已提交
2632 2633 2634

**返回值:**

X
xwb 已提交
2635 2636 2637
| 类型               | 说明     |
| ------------------ | -------- |
| Promise\<[DataBlob](#datablob)> | 共享秘密。 |
W
wangyongzhong2 已提交
2638 2639 2640

**错误码:**

X
xwb 已提交
2641 2642 2643 2644 2645 2646
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17620002 | runtime error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
2647

X
xwb 已提交
2648
**callback示例:**
W
wangyongzhong2 已提交
2649

X
xwb 已提交
2650
```js
W
wangyongzhong2 已提交
2651 2652
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
2653 2654 2655 2656 2657 2658
let globalKeyPair; // globalKeyPair为使用非对称密钥生成器生成的非对称密钥对象,此处省略生成过程
let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");
keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey, function (err, secret) {
  if (err) {
    console.error("keyAgreement error.");
    return;
W
wangyongzhong2 已提交
2659
  }
X
xwb 已提交
2660
  console.info("keyAgreement output is " + secret.data);
W
wangyongzhong2 已提交
2661 2662 2663
});
```

X
xwb 已提交
2664
**promise示例:**
W
wangyongzhong2 已提交
2665

X
xwb 已提交
2666
```js
W
wangyongzhong2 已提交
2667 2668
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
2669 2670 2671 2672 2673 2674 2675
let globalKeyPair; // globalKeyPair为使用非对称密钥生成器生成的非对称密钥对象,此处省略生成过程
let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");
let keyAgreementPromise = keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey);
keyAgreementPromise.then((secret) => {
  console.info("keyAgreement output is " + secret.data);
}).catch((error) => {
  console.error("keyAgreement error.");
W
wangyongzhong2 已提交
2676 2677 2678
});
```

X
xwb 已提交
2679
## cryptoFramework.createMd
W
wangyongzhong2 已提交
2680

X
xwb 已提交
2681
createMd(algName: string): Md
W
wangyongzhong2 已提交
2682

X
xwb 已提交
2683
生成Md实例,用于进行消息摘要的计算与操作。<br/>支持的规格详见框架概述“[MD消息摘要算法规格](../../security/cryptoFramework-overview.md#md消息摘要算法规格)”一节。
W
wangyongzhong2 已提交
2684 2685 2686 2687 2688 2689 2690

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

| 参数名  | 类型   | 必填 | 说明                                                         |
| ------- | ------ | ---- | ------------------------------------------------------------ |
X
xwb 已提交
2691
| algName | string | 是   | 指定摘要算法,支持算法请参考“[MD算法支持范围](../../security/cryptoFramework-overview.md#md消息摘要算法规格)”一节。 |
W
wangyongzhong2 已提交
2692 2693 2694

**返回值**

X
xwb 已提交
2695 2696 2697 2698 2699 2700 2701 2702 2703 2704
| 类型 | 说明                                    |
| ---- | --------------------------------------- |
| Md   | 返回由输入算法指定生成的[Md](#md)对象。 |

**错误码:**

| 错误码ID | 错误信息           |
| -------- | ------------------ |
| 401 | invalid parameters.       |
| 17620001 | memory error.       |
W
wangyongzhong2 已提交
2705 2706 2707

**示例:**

X
xwb 已提交
2708
```js
W
wangyongzhong2 已提交
2709 2710
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
2711 2712 2713 2714 2715
var md;
try {
    // 参数选择请参考上述算法支持范围
    md = cryptoFramework.createMd("SHA256");
} catch (error) {
2716
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
2717
}
W
wangyongzhong2 已提交
2718 2719
```

X
xwb 已提交
2720
## Md
W
wangyongzhong2 已提交
2721

X
xwb 已提交
2722
Md类,调用Md方法可以进行MD(Message Digest)摘要计算。调用前,需要通过[createMd](#cryptoframeworkcreatemd)构造Md实例。
W
wangyongzhong2 已提交
2723

X
xwb 已提交
2724
### 属性
W
wangyongzhong2 已提交
2725

X
xwb 已提交
2726
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
2727

X
xwb 已提交
2728 2729 2730
| 名称    | 类型   | 可读 | 可写 | 说明                   |
| ------- | ------ | ---- | ---- | ---------------------- |
| algName | string | 是   | 否   | 代表指定的摘要算法名。 |
W
wangyongzhong2 已提交
2731

X
xwb 已提交
2732
### update
W
wangyongzhong2 已提交
2733

X
xwb 已提交
2734 2735 2736 2737
update(input: DataBlob, callback: AsyncCallback\<void>): void

传入消息进行Md更新计算。

X
xwb 已提交
2738 2739
> **说明:**
>
X
xwb 已提交
2740
> Md算法多次调用update更新的代码示例详见开发指导“[使用摘要操作](../../security/cryptoFramework-guidelines.md#使用摘要操作)”。
W
wangyongzhong2 已提交
2741 2742 2743

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759
**参数:**

| 参数名   | 类型                  | 必填 | 说明         |
| -------- | --------------------- | ---- | ------------ |
| input    | [DataBlob](#datablob) | 是   | 传入的消息。 |
| callback | AsyncCallback\<void>  | 是   | 回调函数。   |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.       |
| 17630001 | crypto operation error. |

**示例:**

X
xwb 已提交
2760
```js
X
xwb 已提交
2761 2762 2763 2764 2765 2766
import cryptoFramework from "@ohos.security.cryptoFramework"

var md;
try {
    md = cryptoFramework.createMd("SHA256");
} catch (error) {
2767
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779
}
console.error("Md algName is: " + md.algName);

let blob;
md.update(blob, (err,) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    }
});
```

### update
W
wangyongzhong2 已提交
2780

X
xwb 已提交
2781
update(input: DataBlob): Promise\<void>
W
wangyongzhong2 已提交
2782

X
xwb 已提交
2783
传入消息进行Md更新计算。
W
wangyongzhong2 已提交
2784

X
xwb 已提交
2785 2786
> **说明:**
>
X
xwb 已提交
2787
> Md算法多次调用update更新的代码示例详见开发指导“[使用摘要操作](../../security/cryptoFramework-guidelines.md#使用摘要操作)”。
W
wangyongzhong2 已提交
2788 2789 2790

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
2791 2792 2793
| 参数名 | 类型     | 必填 | 说明         |
| ------ | -------- | ---- | ------------ |
| input  | DataBlob | 是   | 传入的消息。 |
W
wangyongzhong2 已提交
2794

X
xwb 已提交
2795 2796 2797 2798 2799
**返回值:**

| 类型           | 说明          |
| -------------- | ------------- |
| Promise\<void> | Promise对象。 |
W
wangyongzhong2 已提交
2800 2801 2802 2803 2804

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
2805
| 401 | invalid parameters.       |
W
wangyongzhong2 已提交
2806 2807
| 17630001 | crypto operation error. |

X
xwb 已提交
2808
**示例:**
W
wangyongzhong2 已提交
2809

X
xwb 已提交
2810
```js
X
xwb 已提交
2811
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
2812

X
xwb 已提交
2813 2814 2815 2816
var md;
try {
    md = cryptoFramework.createMd("SHA256");
} catch (error) {
2817
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
2818 2819
}
console.error("Md algName is: " + md.algName);
W
wangyongzhong2 已提交
2820

X
xwb 已提交
2821 2822 2823 2824 2825 2826 2827 2828
let blob;
var promiseMdUpdate = md.update(blob);
promiseMdUpdate.then(() => {
    // do something
}).catch(error => {
    console.error("[Promise]: error: " + error.message);
});
```
W
wangyongzhong2 已提交
2829

X
xwb 已提交
2830
### digest
W
wangyongzhong2 已提交
2831

X
xwb 已提交
2832
digest(callback: AsyncCallback\<DataBlob>): void
W
wangyongzhong2 已提交
2833

X
xwb 已提交
2834
返回Md的计算结果。
W
wangyongzhong2 已提交
2835

X
xwb 已提交
2836 2837 2838 2839 2840
**系统能力:** SystemCapability.Security.CryptoFramework

| 参数名   | 类型                     | 必填 | 说明       |
| -------- | ------------------------ | ---- | ---------- |
| callback | AsyncCallback\<DataBlob> | 是   | 回调函数。 |
W
wangyongzhong2 已提交
2841 2842 2843 2844 2845

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
2846
| 17620001 | memory error.           |
W
wangyongzhong2 已提交
2847 2848
| 17630001 | crypto operation error. |

X
xwb 已提交
2849
**示例:**
W
wangyongzhong2 已提交
2850

X
xwb 已提交
2851
```js
X
xwb 已提交
2852
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
2853

X
xwb 已提交
2854 2855 2856 2857
var md;
try {
    md = cryptoFramework.createMd("SHA256");
} catch (error) {
2858
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
2859 2860
}
console.error("Md algName is: " + md.algName);
W
wangyongzhong2 已提交
2861

X
xwb 已提交
2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881
let blob;
md.update(blob, (err,) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    }
    md.digest((err1, mdOutput) => {
		if (err1) {
            console.error("[Callback] err: " + err1.code);
        } else {
            console.error("[Callback]: MD result: " + mdOutput);
        }
    });
});
```

### digest

digest(): Promise\<DataBlob>

返回Md的计算结果。
W
wangyongzhong2 已提交
2882 2883 2884

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
2885
**返回值:**
W
wangyongzhong2 已提交
2886

X
xwb 已提交
2887 2888 2889
| 类型               | 说明        |
| ------------------ | ----------- |
| Promise\<[DataBlob](#datablob)> | Promise对象。 |
W
wangyongzhong2 已提交
2890 2891 2892 2893 2894

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
2895
| 17620001 | memory error.           |
W
wangyongzhong2 已提交
2896 2897
| 17630001 | crypto operation error. |

X
xwb 已提交
2898 2899
**示例:**

X
xwb 已提交
2900
```js
X
xwb 已提交
2901
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
2902

X
xwb 已提交
2903 2904 2905 2906
var md;
try {
    md = cryptoFramework.createMd("SHA256");
} catch (error) {
2907
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
2908 2909
}
console.error("Md algName is: " + md.algName);
W
wangyongzhong2 已提交
2910

X
xwb 已提交
2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921
let blob;
var promiseMdUpdate = md.update(blob);
promiseMdUpdate.then(() => {
    var PromiseMdDigest = md.digest();
    return PromiseMdDigest;
}).then(mdOutput => {
    console.error("[Promise]: MD result: " + mdOutput.data);
}).catch(error => {
    console.error("[Promise]: error: " + error.message);
});
```
W
wangyongzhong2 已提交
2922

X
xwb 已提交
2923
### getMdLength
W
wangyongzhong2 已提交
2924

X
xwb 已提交
2925
getMdLength(): number
W
wangyongzhong2 已提交
2926

X
xwb 已提交
2927
获取Md消息摘要长度(字节数)。
W
wangyongzhong2 已提交
2928

X
xwb 已提交
2929
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
2930 2931 2932

**返回值:**

X
xwb 已提交
2933 2934 2935
| 类型   | 说明                       |
| ------ | -------------------------- |
| number | 返回md计算结果的字节长度。 |
W
wangyongzhong2 已提交
2936 2937 2938 2939 2940 2941 2942

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 17630001 | crypto operation error. |

X
xwb 已提交
2943
**示例:**
W
wangyongzhong2 已提交
2944

X
xwb 已提交
2945
```js
X
xwb 已提交
2946
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
2947

X
xwb 已提交
2948 2949 2950 2951
var md;
try {
    md = cryptoFramework.createMd("SHA256");
} catch (error) {
2952
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
2953 2954
}
console.error("Md algName is: " + md.algName);
W
wangyongzhong2 已提交
2955

X
xwb 已提交
2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968
let blob;
var promiseMdUpdate = md.update(blob);
promiseMdUpdate.then(() => {
    var PromiseMdDigest = md.digest();
    return PromiseMdDigest;
}).then(mdOutput => {
    console.error("[Promise]: MD result: " + mdOutput.data);
    let mdLen = md.getMdLength();
	console.error("MD len: " + mdLen);
}).catch(error => {
    console.error("[Promise]: error: " + error.message);
});
```
W
wangyongzhong2 已提交
2969

X
xwb 已提交
2970
## cryptoFramework.createMac
W
wangyongzhong2 已提交
2971

X
xwb 已提交
2972
createMac(algName: string): Mac
W
wangyongzhong2 已提交
2973

X
xwb 已提交
2974
生成Mac实例,用于进行消息认证码的计算与操作。<br/>支持的规格详见框架概述“[HMAC消息认证码算法规格](../../security/cryptoFramework-overview.md#hmac消息认证码算法规格)”一节。
W
wangyongzhong2 已提交
2975 2976 2977 2978 2979

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
2980 2981 2982
| 参数名  | 类型   | 必填 | 说明                                                         |
| ------- | ------ | ---- | ------------------------------------------------------------ |
| algName | string | 是   | 指定摘要算法,支持算法请参考“[HMAC算法支持范围](../../security/cryptoFramework-overview.md#hmac消息认证码算法规格)”一节。 |
W
wangyongzhong2 已提交
2983

X
xwb 已提交
2984
**返回值**
W
wangyongzhong2 已提交
2985

X
xwb 已提交
2986 2987 2988
| 类型 | 说明                                      |
| ---- | ----------------------------------------- |
| Mac  | 返回由输入算法指定生成的[Mac](#mac)对象。 |
W
wangyongzhong2 已提交
2989

W
wangyongzhong2 已提交
2990 2991
**错误码:**

X
xwb 已提交
2992 2993 2994 2995
| 错误码ID | 错误信息           |
| -------- | ------------------ |
| 401 | invalid parameters.       |
| 17620001 | memory error.       |
W
wangyongzhong2 已提交
2996

X
xwb 已提交
2997
**示例:**
W
wangyongzhong2 已提交
2998

X
xwb 已提交
2999
```js
W
wangyongzhong2 已提交
3000 3001
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3002 3003 3004 3005 3006
var mac;
try {
    // 参数选择请参考上述算法支持范围
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3007
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
W
wangyongzhong2 已提交
3008 3009 3010
}
```

X
xwb 已提交
3011
## Mac
W
wangyongzhong2 已提交
3012

X
xwb 已提交
3013
Mac类,调用Mac方法可以进行MAC(Message Authentication Code)加密计算。调用前,需要通过[createMac](#cryptoframeworkcreatemac)构造Mac实例。
W
wangyongzhong2 已提交
3014

X
xwb 已提交
3015
### 属性
W
wangyongzhong2 已提交
3016

X
xwb 已提交
3017
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
3018

X
xwb 已提交
3019 3020 3021
| 名称    | 类型   | 可读 | 可写 | 说明                   |
| ------- | ------ | ---- | ---- | ---------------------- |
| algName | string | 是   | 否   | 代表指定的摘要算法名。 |
W
wangyongzhong2 已提交
3022

X
xwb 已提交
3023
### init
W
wangyongzhong2 已提交
3024

X
xwb 已提交
3025
init(key: SymKey, callback: AsyncCallback\<void>): void
W
wangyongzhong2 已提交
3026

X
xwb 已提交
3027
使用对称密钥初始化Mac计算。
W
wangyongzhong2 已提交
3028 3029 3030 3031 3032

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
3033 3034 3035 3036
| 参数名   | 类型                 | 必填 | 说明           |
| -------- | -------------------- | ---- | -------------- |
| key      | [SymKey](#symkey)    | 是   | 共享对称密钥。 |
| callback | AsyncCallback\<void> | 是   | 回调函数。     |
W
wangyongzhong2 已提交
3037

X
xwb 已提交
3038
**错误码:**
W
wangyongzhong2 已提交
3039

X
xwb 已提交
3040 3041 3042 3043
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.       |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
3044 3045 3046

**示例:**

X
xwb 已提交
3047
```js
W
wangyongzhong2 已提交
3048 3049
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3050 3051 3052 3053
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3054
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067
}
var KeyBlob;
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    }
    mac.init(symKey, (err1, ) => {
        if (err1) {
            console.error("[Callback] err: " + err1.code);
        }
    });
});
W
wangyongzhong2 已提交
3068 3069
```

X
xwb 已提交
3070
### init
W
wangyongzhong2 已提交
3071

X
xwb 已提交
3072
init(key: SymKey): Promise\<void>
W
wangyongzhong2 已提交
3073

X
xwb 已提交
3074
使用对称密钥初始化Mac计算。
W
wangyongzhong2 已提交
3075

X
xwb 已提交
3076
**系统能力:** SystemCapability.Security.CryptoFramework
W
wangyongzhong2 已提交
3077

X
xwb 已提交
3078
**参数:**
W
wangyongzhong2 已提交
3079

X
xwb 已提交
3080 3081 3082
| 参数名 | 类型   | 必填 | 说明         |
| ------ | ------ | ---- | ------------ |
| key    | [SymKey](#symkey) | 是   | 共享对称密钥。 |
W
wangyongzhong2 已提交
3083

X
xwb 已提交
3084
**返回值:**
W
wangyongzhong2 已提交
3085

X
xwb 已提交
3086 3087 3088
| 类型           | 说明          |
| -------------- | ------------- |
| Promise\<void> | Promise对象。 |
W
wangyongzhong2 已提交
3089

X
xwb 已提交
3090
**错误码:**
W
wangyongzhong2 已提交
3091

X
xwb 已提交
3092 3093 3094 3095
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.       |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
3096

X
xwb 已提交
3097
**示例:**
W
wangyongzhong2 已提交
3098

X
xwb 已提交
3099
```js
X
xwb 已提交
3100
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
3101

X
xwb 已提交
3102 3103 3104 3105
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3106
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118
}
console.error("Mac algName is: " + mac.algName);

var KeyBlob;
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
promiseConvertKey.then(symKey => {
    var promiseMacInit = mac.init(symKey);
    return promiseMacInit;
}).catch(error => {
    console.error("[Promise]: error: " + error.message);
});
W
wangyongzhong2 已提交
3119

X
xwb 已提交
3120
```
W
wangyongzhong2 已提交
3121

X
xwb 已提交
3122 3123 3124 3125 3126 3127
### update

update(input: DataBlob, callback: AsyncCallback\<void>): void

传入消息进行Mac更新计算。

X
xwb 已提交
3128 3129
> **说明:**
>
X
xwb 已提交
3130
> Hmac算法多次调用update更新的代码示例详见开发指导“[使用消息认证码操作](../../security/cryptoFramework-guidelines.md#使用消息认证码操作)”。
W
wangyongzhong2 已提交
3131 3132 3133 3134 3135

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
3136 3137 3138 3139
| 参数名   | 类型                  | 必填 | 说明         |
| -------- | --------------------- | ---- | ------------ |
| input    | [DataBlob](#datablob) | 是   | 传入的消息。 |
| callback | AsyncCallback\<void>  | 是   | 回调函数。   |
W
wangyongzhong2 已提交
3140 3141 3142 3143 3144

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
3145
| 401 | invalid parameters.       |
W
wangyongzhong2 已提交
3146 3147
| 17630001 | crypto operation error. |

X
xwb 已提交
3148 3149
**示例:**

X
xwb 已提交
3150
```js
X
xwb 已提交
3151 3152 3153 3154 3155 3156 3157
import cryptoFramework from "@ohos.security.cryptoFramework"

var KeyBlob;
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3158
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179
}
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    }
    mac.init(symKey, (err1, ) => {
        if (err1) {
            console.error("[Callback] err: " + err1.code);
        }
        let blob;
      	mac.update(blob, (err2, data) => {
        	if (err2) {
            console.error("[Callback] err: " + err2.code);
        	}
      	});
    });
});
```

### update
W
wangyongzhong2 已提交
3180

X
xwb 已提交
3181
update(input: DataBlob): Promise\<void>
W
wangyongzhong2 已提交
3182

X
xwb 已提交
3183 3184
传入消息进行Mac更新计算。

X
xwb 已提交
3185 3186
> **说明:**
>
X
xwb 已提交
3187
> Hmac算法多次调用update更新的代码示例详见开发指导“[使用消息认证码操作](../../security/cryptoFramework-guidelines.md#使用消息认证码操作)”。
W
wangyongzhong2 已提交
3188 3189 3190 3191 3192

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
3193 3194 3195
| 参数名 | 类型     | 必填 | 说明       |
| ------ | -------- | ---- | ---------- |
| input  | [DataBlob](#datablob) | 是   | 传入的消息。 |
W
wangyongzhong2 已提交
3196 3197 3198

**返回值:**

X
xwb 已提交
3199 3200 3201
| 类型           | 说明          |
| -------------- | ------------- |
| Promise\<void> | Promise对象。 |
W
wangyongzhong2 已提交
3202 3203 3204 3205 3206

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
3207
| 401 | invalid parameters.       |
W
wangyongzhong2 已提交
3208 3209
| 17630001 | crypto operation error. |

X
xwb 已提交
3210
**示例:**
W
wangyongzhong2 已提交
3211

X
xwb 已提交
3212
```js
X
xwb 已提交
3213
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
3214

X
xwb 已提交
3215 3216 3217 3218
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3219
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3220 3221
}
console.error("Mac algName is: " + mac.algName);
W
wangyongzhong2 已提交
3222

X
xwb 已提交
3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243
var KeyBlob;
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
promiseConvertKey.then(symKey => {
    var promiseMacInit = mac.init(symKey);
    return promiseMacInit;
}).then(() => {
    let blob;
    var promiseMacUpdate = mac.update(blob);
    return promiseMacUpdate;
}).catch(error => {
    console.error("[Promise]: error: " + error.message);
});

```

### doFinal

doFinal(callback: AsyncCallback\<DataBlob>): void

返回Mac的计算结果。
W
wangyongzhong2 已提交
3244 3245 3246 3247 3248

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
3249 3250 3251
| 参数名   | 类型                     | 必填 | 说明     |
| -------- | ------------------------ | ---- | -------- |
| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。 |
W
wangyongzhong2 已提交
3252 3253 3254 3255 3256

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
3257
| 17620001 | memory error.           |
W
wangyongzhong2 已提交
3258 3259
| 17630001 | crypto operation error. |

X
xwb 已提交
3260 3261
**示例:**

X
xwb 已提交
3262
```js
X
xwb 已提交
3263 3264 3265 3266 3267 3268 3269
import cryptoFramework from "@ohos.security.cryptoFramework"

var KeyBlob;
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3270
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319
}
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    }
    mac.init(symKey, (err1, ) => {
        if (err1) {
            console.error("[Callback] err: " + err1.code);
        }
        let blob;
        mac.update(blob, (err2, ) => {
            if (err2) {
                console.error("[Callback] err: " + err2.code);
            }
            mac.doFinal((err3, macOutput) => {
                if (err3) {
                    console.error("[Callback] err: " + err3.code);
                } else {
                    console.error("[Promise]: HMAC result: " + macOutput);
                }
            });
        });
    });
});
```

### doFinal

doFinal(): Promise\<DataBlob>

返回Mac的计算结果。

**系统能力:** SystemCapability.Security.CryptoFramework

**返回值:**

| 类型               | 说明        |
| ------------------ | ----------- |
| Promise\<[DataBlob](#datablob)> | Promise对象。 |

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 17620001 | memory error.           |
| 17630001 | crypto operation error. |

**示例:**
W
wangyongzhong2 已提交
3320

X
xwb 已提交
3321
```js
X
xwb 已提交
3322 3323 3324 3325 3326 3327
import cryptoFramework from "@ohos.security.cryptoFramework"

var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3328
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352
}
console.error("Mac algName is: " + mac.algName);

var KeyBlob;
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
promiseConvertKey.then(symKey => {
    var promiseMacInit = mac.init(symKey);
    return promiseMacInit;
}).then(() => {
    let blob;
    var promiseMacUpdate = mac.update(blob);
    return promiseMacUpdate;
}).then(() => {
    var PromiseMacDoFinal = mac.doFinal();
    return PromiseMacDoFinal;
}).then(macOutput => {
    console.error("[Promise]: HMAC result: " + macOutput.data);
}).catch(error => {
    console.error("[Promise]: error: " + error.message);
});
```

### getMacLength
W
wangyongzhong2 已提交
3353

X
xwb 已提交
3354
getMacLength(): number
W
wangyongzhong2 已提交
3355

X
xwb 已提交
3356
获取Mac消息认证码的长度(字节数)。
W
wangyongzhong2 已提交
3357 3358 3359 3360 3361

**系统能力:** SystemCapability.Security.CryptoFramework

**返回值:**

X
xwb 已提交
3362 3363 3364
| 类型   | 说明                        |
| ------ | --------------------------- |
| number | 返回mac计算结果的字节长度。 |
W
wangyongzhong2 已提交
3365 3366 3367 3368 3369 3370 3371

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 17630001 | crypto operation error. |

X
xwb 已提交
3372
**示例:**
W
wangyongzhong2 已提交
3373

X
xwb 已提交
3374
```js
X
xwb 已提交
3375
import cryptoFramework from "@ohos.security.cryptoFramework"
W
wangyongzhong2 已提交
3376

X
xwb 已提交
3377 3378 3379 3380
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3381
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3382 3383
}
console.error("Mac algName is: " + mac.algName);
W
wangyongzhong2 已提交
3384

X
xwb 已提交
3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405
var KeyBlob;
var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
promiseConvertKey.then(symKey => {
    var promiseMacInit = mac.init(symKey);
    return promiseMacInit;
}).then(() => {
    let blob;
    var promiseMacUpdate = mac.update(blob);
    return promiseMacUpdate;
}).then(() => {
    var PromiseMacDoFinal = mac.doFinal();
    return PromiseMacDoFinal;
}).then(macOutput => {
    console.error("[Promise]: HMAC result: " + macOutput.data);
    let macLen = mac.getMacLength();
	console.error("MAC len: " + macLen);
}).catch(error => {
    console.error("[Promise]: error: " + error.message);
});
```
W
wangyongzhong2 已提交
3406

X
xwb 已提交
3407
## cryptoFramework.createRandom
W
wangyongzhong2 已提交
3408

X
xwb 已提交
3409
createRandom(): Random
W
wangyongzhong2 已提交
3410

X
xwb 已提交
3411
生成Random实例,用于进行随机数的计算与设置种子。<br/>支持的规格详见框架概述“[随机数算法规格](../../security/cryptoFramework-overview.md#随机数)”一节。
W
wangyongzhong2 已提交
3412 3413 3414

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
3415
**返回值**
W
wangyongzhong2 已提交
3416

X
xwb 已提交
3417 3418 3419
| 类型   | 说明                                            |
| ------ | ----------------------------------------------- |
| Random | 返回由输入算法指定生成的[Random](#random)对象。 |
W
wangyongzhong2 已提交
3420 3421 3422

**错误码:**

X
xwb 已提交
3423 3424 3425
| 错误码ID | 错误信息     |
| -------- | ------------ |
| 17620001 | memory error. |
W
wangyongzhong2 已提交
3426

X
xwb 已提交
3427
**示例:**
W
wangyongzhong2 已提交
3428

X
xwb 已提交
3429
```js
W
wangyongzhong2 已提交
3430 3431
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3432 3433 3434
try {
    var rand = cryptoFramework.createRandom();
} catch (error) {
3435
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3436
}
W
wangyongzhong2 已提交
3437 3438
```

X
xwb 已提交
3439
## Random
W
wangyongzhong2 已提交
3440

X
xwb 已提交
3441
Random类,调用Random方法可以进行随机数计算。调用前,需要通过[createRandom](#cryptoframeworkcreaterandom)构造Random实例。
W
wangyongzhong2 已提交
3442

X
xwb 已提交
3443
### 属性
W
wangyongzhong2 已提交
3444

X
xwb 已提交
3445 3446 3447 3448 3449
**系统能力:** SystemCapability.Security.CryptoFramework

| 名称    | 类型   | 可读 | 可写 | 说明                 |
| ------- | ------ | ---- | ---- | -------------------- |
| algName<sup>10+</sup> | string | 是   | 否   | 代表当前使用的随机数生成算法,目前只支持“CTR_DRBG"。 |
W
wangyongzhong2 已提交
3450

X
xwb 已提交
3451
### generateRandom
W
wangyongzhong2 已提交
3452

X
xwb 已提交
3453 3454 3455
generateRandom(len: number, callback: AsyncCallback\<DataBlob>): void

异步生成指定长度的随机数。
W
wangyongzhong2 已提交
3456 3457 3458 3459 3460

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
3461 3462 3463 3464
| 参数名   | 类型                     | 必填 | 说明                 |
| -------- | ------------------------ | ---- | -------------------- |
| len      | number                   | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。            |
W
wangyongzhong2 已提交
3465

X
xwb 已提交
3466
**错误码:**
W
wangyongzhong2 已提交
3467

X
xwb 已提交
3468 3469 3470 3471 3472
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
3473 3474 3475

**示例:**

X
xwb 已提交
3476
```js
W
wangyongzhong2 已提交
3477 3478
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3479 3480 3481 3482
var rand;
try {
    rand = cryptoFramework.createRandom();
} catch (error) {
3483
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3484 3485 3486 3487 3488 3489 3490 3491
}
rand.generateRandom(12, (err, randData) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    } else {
        console.error("[Callback]: generate random result: " + randData.data);
    }
});
W
wangyongzhong2 已提交
3492 3493
```

X
xwb 已提交
3494
### generateRandom
W
wangyongzhong2 已提交
3495

X
xwb 已提交
3496
generateRandom(len: number): Promise\<DataBlob>
W
wangyongzhong2 已提交
3497

X
xwb 已提交
3498
异步生成指定长度的随机数。
W
wangyongzhong2 已提交
3499 3500 3501

**系统能力:** SystemCapability.Security.CryptoFramework

X
xwb 已提交
3502
**参数:**
W
wangyongzhong2 已提交
3503

X
xwb 已提交
3504 3505 3506
| 参数名 | 类型   | 必填 | 说明                                                   |
| ------ | ------ | ---- | ------------------------------------------------------ |
| len    | number | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
W
wangyongzhong2 已提交
3507

X
xwb 已提交
3508
**返回值:**
W
wangyongzhong2 已提交
3509

X
xwb 已提交
3510 3511 3512
| 类型               | 说明        |
| ------------------ | ----------- |
| Promise\<[DataBlob](#datablob)> | Promise对象。 |
W
wangyongzhong2 已提交
3513 3514 3515 3516 3517

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
3518 3519
| 401 | invalid parameters.          |
| 17620001 | memory error.           |
W
wangyongzhong2 已提交
3520 3521
| 17630001 | crypto operation error. |

X
xwb 已提交
3522 3523
**示例:**

X
xwb 已提交
3524
```js
X
xwb 已提交
3525 3526 3527 3528 3529 3530
import cryptoFramework from "@ohos.security.cryptoFramework"

var rand;
try {
    rand = cryptoFramework.createRandom();
} catch (error) {
3531
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542
}

var promiseGenerateRand = rand.generateRandom(12);
promiseGenerateRand.then(randData => {
    console.error("[Promise]: rand result: " + randData.data);
}).catch(error => {
    console.error("[Promise]: error: " + error.message);
});
```

### generateRandomSync<sup>10+</sup>
W
wangyongzhong2 已提交
3543

X
xwb 已提交
3544
generateRandomSync(len: number): DataBlob
W
wangyongzhong2 已提交
3545

X
xwb 已提交
3546
以同步方法生成指定长度的随机数。
W
wangyongzhong2 已提交
3547 3548 3549 3550 3551

**系统能力:** SystemCapability.Security.CryptoFramework

**参数:**

X
xwb 已提交
3552 3553 3554
| 参数名 | 类型   | 必填 | 说明                 |
| ------ | ------ | ---- | -------------------- |
| len    | number | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
W
wangyongzhong2 已提交
3555 3556 3557

**返回值:**

X
xwb 已提交
3558 3559 3560
| 类型               | 说明        |
| ------------------ | ----------- |
|[DataBlob](#datablob) | 表示生成的随机数。 |
W
wangyongzhong2 已提交
3561 3562 3563 3564 3565

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
3566 3567
| 401 | invalid parameters.          |
| 17620001 | memory error.           |
W
wangyongzhong2 已提交
3568 3569
| 17630001 | crypto operation error. |

X
xwb 已提交
3570
**示例:**
W
wangyongzhong2 已提交
3571

X
xwb 已提交
3572
```js
W
wangyongzhong2 已提交
3573 3574
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3575 3576 3577 3578
var rand;
try {
    rand = cryptoFramework.createRandom();
} catch (error) {
3579
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3580 3581
}

X
xwb 已提交
3582
try {
X
xwb 已提交
3583
  let randData = rand.generateRandomSync(12);
X
xwb 已提交
3584 3585 3586 3587 3588 3589 3590 3591
  if (randData != null) {
    console.info("[Sync]: rand result: " + randData.data);
  } else {
    console.error("[Sync]: get rand result fail!");
  }
} catch (error) {
  console.error("[Sync]: error: " + error.message);
}
W
wangyongzhong2 已提交
3592 3593
```

X
xwb 已提交
3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612
### setSeed

setSeed(seed: DataBlob): void

设置指定的种子。

**系统能力:** SystemCapability.Security.CryptoFramework

| 参数名 | 类型     | 必填 | 说明         |
| ------ | -------- | ---- | ------------ |
| seed   | DataBlob | 是   | 设置的种子。 |

**错误码:**

| 错误码ID | 错误信息           |
| -------- | ----------------- |
| 17620001 | memory error.      |

**示例:**
W
wangyongzhong2 已提交
3613

X
xwb 已提交
3614
```js
W
wangyongzhong2 已提交
3615 3616
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3617 3618 3619 3620
var rand;
try {
    rand = cryptoFramework.createRandom();
} catch (error) {
3621
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3622 3623 3624 3625 3626 3627
}

rand.generateRandom(12, (err, randData) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    } else {
3628
        console.info("[Callback]: generate random result: " + randData.data);
X
xwb 已提交
3629 3630 3631
        try {
            rand.setSeed(randData);
        } catch (error) {
3632
            console.error("setSeed failed, errCode: " + error.code + ", errMsg: " + error.message);
X
xwb 已提交
3633 3634
        }
    }
W
wangyongzhong2 已提交
3635
});
X
xwb 已提交
3636
```