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

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

> **说明:**
>
7 8
>- 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
>- 以下示例代码片段仅适用于JS语言开发。
W
wangyongzhong2 已提交
9 10 11

## 导入模块

X
xwb 已提交
12
```js
W
wangyongzhong2 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
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 已提交
28
| ERR_CRYPTO_OPERATION                  | 17630001 | 调用三方算 法库API出错。     |
W
wangyongzhong2 已提交
29 30 31 32 33 34 35 36 37 38 39

## DataBlob

buffer数组。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

X
xwb 已提交
74 75 76 77 78
| 名称    | 类型                  | 可读 | 可写 | 说明                                                         |
| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
| 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 已提交
79

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

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

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

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

X
xwb 已提交
90 91 92 93 94
| 名称    | 类型                  | 可读 | 可写 | 说明                                                         |
| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
| 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 已提交
95

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

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

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

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

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

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

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

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

X
xwb 已提交
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 143
| 名称         | 值   | 说明             |
| ------------ | ---- | ---------------- |
| 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 已提交
144

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

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

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

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

X
xwb 已提交
158 159 160 161 162 163 164 165
**系统能力:** 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 已提交
166

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

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

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

X
xwb 已提交
173 174 175 176 177 178 179
| 名称         | 值   | 说明             |
| ------------ | ---- | ---------------- |
| 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 已提交
180

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**返回值:**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

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

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

**示例:**

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

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 已提交
422 423
```

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

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

### 属性

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

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

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

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

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

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

**参数:**

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

**返回值:**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**参数:**

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

**返回值:**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

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


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

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

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

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

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

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

**返回值:**

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

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

**示例:**

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

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

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

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

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

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

### generateSymKey
W
wangyongzhong2 已提交
601

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

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

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

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

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

**错误码:**

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

**示例:**

X
xwb 已提交
622 623 624 625 626 627 628 629 630 631 632
```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 已提交
633 634
```

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

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

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

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

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

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

**错误码:**

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

**示例:**

X
xwb 已提交
657 658 659 660 661 662 663 664 665 666
```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 已提交
667 668
```

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

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

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

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

**参数:**

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

**错误码:**

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

**示例:**

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

X
xwb 已提交
696 697 698 699 700 701 702
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 已提交
703
}
X
xwb 已提交
704 705 706 707 708 709 710 711 712 713 714

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 已提交
715 716
```

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

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

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

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

**参数:**

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

**返回值:**

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

**错误码:**

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

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

X
xwb 已提交
746 747 748 749 750 751 752 753 754 755
```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 已提交
756 757
}

X
xwb 已提交
758 759 760 761 762 763 764 765 766
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 已提交
767 768
```

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

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

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

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

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

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

**返回值:**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**示例:**

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

919 920
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 已提交
921 922 923 924 925 926 927 928 929 930
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 已提交
931 932
```

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

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

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

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

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

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

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

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

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

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

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

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

967 968
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 已提交
969 970 971 972 973 974 975 976 977 978
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 已提交
979

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

X
xwb 已提交
982 983 984
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 已提交
985

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

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

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

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

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

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

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

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

**错误码:**

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

**示例:**

X
xwb 已提交
1016
```js
X
xwb 已提交
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
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 已提交
1041 1042
}

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

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

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

### 属性

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

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

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

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

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

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

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

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**参数:**

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

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

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

**示例:**

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

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

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

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

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

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

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

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

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

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

**示例:**

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

let asyKeyPairSpec; // asyKeyPairSpec为全量密钥参数
let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec);
X
xwb 已提交
1201
let keyGenPromise = asyKeyGeneratorBySpec.generatePriKey();
X
xwb 已提交
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
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 已提交
1214 1215 1216 1217 1218

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

**参数:**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

**返回值:**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

**参数:**

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

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

**返回值:**

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

**错误码:**

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

**示例:**

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

X
xwb 已提交
1322 1323 1324 1325 1326 1327 1328
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 已提交
1329
}
X
xwb 已提交
1330
```
W
wangyongzhong2 已提交
1331

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

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

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

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

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

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


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

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

X
xwb 已提交
1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365
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 已提交
1366 1367 1368

**错误码:**

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

**示例:**

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

X
xwb 已提交
1383 1384 1385 1386 1387 1388 1389
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 已提交
1390 1391 1392
})
```

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

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

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

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

**参数:**

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

**返回值:**

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

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

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

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

X
xwb 已提交
1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437
```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 已提交
1438

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

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

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

X
xwb 已提交
1445 1446
> **说明:**
>
X
xwb 已提交
1447
> 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 已提交
1448 1449 1450
> 2. 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[doFinal](#dofinal-2))或多次调用update。<br/>
>    算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,采用多次update的方式传入数据。<br/>
>    AES使用多次update操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
W
wutiantian_gitee 已提交
1451
> 3. RSA、SM2非对称加解密不支持update操作。
W
wangyongzhong2 已提交
1452 1453 1454 1455 1456

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

**参数:**

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

**错误码:**

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

**示例:**

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

X
xwb 已提交
1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487
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 已提交
1488
  if (err) {
X
xwb 已提交
1489 1490 1491 1492 1493 1494 1495
    console.error(`Failed to update cipher`);
  } else {
    console.info(`Update cipher success`);
    if (output != null) {
      // 拼接output.data到密文
    }
    // 此处进行doFinal等后续操作
W
wangyongzhong2 已提交
1496 1497 1498 1499
  }
})
```

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

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

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

X
xwb 已提交
1506 1507
> **说明:**
>
X
xwb 已提交
1508
> 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 已提交
1509 1510 1511
> 2. 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[doFinal](#dofinal-2))或多次调用update。<br/>
>    算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,可以采用多次update的方式传入数据。<br/>
>    AES使用多次update操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
W
wutiantian_gitee 已提交
1512
> 3. RSA、SM2非对称加解密不支持update操作。
W
wangyongzhong2 已提交
1513 1514 1515

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

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

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

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

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

**错误码:**

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

**示例:**

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

X
xwb 已提交
1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562
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 已提交
1563 1564
```

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

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

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

X
xwb 已提交
1571 1572
- 对于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 已提交
1573

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

1576
> **说明:**
X
xwb 已提交
1577
>
X
xwb 已提交
1578 1579 1580
>  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 已提交
1581
>  4. RSA、SM2非对称加解密时多次doFinal操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
W
wangyongzhong2 已提交
1582

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

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

| 参数名     | 类型                                  | 必填 | 说明                                                         |
| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
| 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 已提交
1600 1601 1602

**示例:**

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

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

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

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

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

X
xwb 已提交
1627 1628 1629
- 对于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 已提交
1630
(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过Promise获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。
W
wangyongzhong2 已提交
1631

X
xwb 已提交
1632 1633
> **说明:**
>
X
xwb 已提交
1634 1635 1636
>  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 已提交
1637
>  4. RSA、SM2非对称加解密时多次doFinal操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
W
wangyongzhong2 已提交
1638 1639 1640 1641 1642

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

**参数:**

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

**返回值:**

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

**错误码:**

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

**示例:**

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

X
xwb 已提交
1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678
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 已提交
1679 1680
```

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

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

X
xwb 已提交
1686 1687 1688 1689 1690 1691
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 已提交
1692 1693
}

X
xwb 已提交
1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706
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 已提交
1707

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

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

X
xwb 已提交
1713 1714 1715 1716 1717 1718 1719
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 已提交
1720

X
xwb 已提交
1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734
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 已提交
1735

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

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

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

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

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

**参数:**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

**参数:**

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

**返回值:**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

**参数:**

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

**返回值**

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

**错误码:**

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

**示例:**

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

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

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

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

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

X
xwb 已提交
1854 1855
## Sign

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

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

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

X
xwb 已提交
1862
当待签名数据较短时,可在init初始化后,(无需update)直接调用sign接口传入原文数据进行签名。
X
xwb 已提交
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 1928

当待签名数据较长时,可通过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 已提交
1929 1930
### update

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

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

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

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

**参数:**

X
xwb 已提交
1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962
| 参数名   | 类型                  | 必填 | 说明         |
| -------- | --------------------- | ---- | ------------ |
| 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 已提交
1963
追加待签名数据,通过promise方式完成更新。 <br/>必须在对[Sign](#sign)实例使用[init()](#init-3)初始化后,才能使用本函数。
X
xwb 已提交
1964

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

**系统能力:** 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 已提交
1998
对数据进行签名,通过注册回调函数获取签名结果。
X
xwb 已提交
1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021

**系统能力:** 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 已提交
2022
对数据进行签名,通过promise方式返回签名结果。
X
xwb 已提交
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 2048

**系统能力:** 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 已提交
2049
```js
X
xwb 已提交
2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073
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;
2074 2075
    signer.init(priKey, err => {
      signer.update(input1, err => { // add first segment of data
X
xwb 已提交
2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087
        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 已提交
2088
```js
X
xwb 已提交
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 2130
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 已提交
2131
设置签名参数。常用的签名参数可以直接通过[createSign](#cryptoframeworkcreatesign) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。
X
xwb 已提交
2132 2133 2134 2135 2136 2137 2138

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

**参数:**

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

**错误码:**

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

**示例:**

X
xwb 已提交
2153
```js
X
xwb 已提交
2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164
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 已提交
2165
获取签名参数。当前只支持RSA算法。
X
xwb 已提交
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 2191

**系统能力:** 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 已提交
2192
```js
X
xwb 已提交
2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210
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 已提交
2211
| algName | string | 是   | 指定签名算法:RSA,ECC,DSA或SM2<sup>10+</sup>,。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。 |
X
xwb 已提交
2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223

**返回值**

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

**错误码:**

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

**示例:**

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

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

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

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

X
xwb 已提交
2247
当被签名的消息较长时,可通过update接口分段传入被签名的消息,最后调用verify接口对消息全文进行验签。verify接口的data入参支持传null,业务方可在循环中调用update接口,循环结束后调用verify传入签名(signatureData)进行验签。
X
xwb 已提交
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 2313

### 属性

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

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

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

X
xwb 已提交
2346 2347 2348 2349 2350
> **说明:**
>
> 根据数据量,可以不调用update(即[init](#init-5)完成后直接调用[verify](#verify-2))或多次调用update。<br/>
> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/>
> 验签使用多次update操作的示例代码详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
X
xwb 已提交
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 2431

**系统能力:** 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 已提交
2432
```js
X
xwb 已提交
2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450
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 已提交
2451
```js
X
xwb 已提交
2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472
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 已提交
2473 2474 2475
设置验签参数。常用的签名参数可以直接通过[createVerify](#cryptoframeworkcreateverify) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。

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

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

**参数:**

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

**错误码:**

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

**示例:**

X
xwb 已提交
2497
```js
X
xwb 已提交
2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508
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 已提交
2509 2510 2511 2512
获取验签参数。当前只支持RSA算法。

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

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

**参数:**

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

**返回值:**

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

**错误码:**

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

**示例:**

X
xwb 已提交
2538
```js
X
xwb 已提交
2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557
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 已提交
2558

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

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

**错误码:**

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

**示例:**

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

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

```

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

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

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

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

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

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

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

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

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

**参数:**

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

**错误码:**

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

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

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

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

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

**参数:**

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

**返回值:**

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

**错误码:**

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

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

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

X
xwb 已提交
2654 2655 2656 2657 2658 2659
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 已提交
2660
  }
X
xwb 已提交
2661
  console.info("keyAgreement output is " + secret.data);
W
wangyongzhong2 已提交
2662 2663 2664
});
```

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

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

X
xwb 已提交
2670 2671 2672 2673 2674 2675 2676
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 已提交
2677 2678 2679
});
```

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

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

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

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

**参数:**

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

**返回值**

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

**错误码:**

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

**示例:**

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**错误码:**

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

**示例:**

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

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

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

### update
W
wangyongzhong2 已提交
2781

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

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

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

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

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

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

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

**错误码:**

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

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

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

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

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

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

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

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

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

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

**错误码:**

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

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

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

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

X
xwb 已提交
2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882
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 已提交
2883 2884 2885

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

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

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

**错误码:**

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

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

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

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

X
xwb 已提交
2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922
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 已提交
2923

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

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

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

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

**返回值:**

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

**错误码:**

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

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

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

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

X
xwb 已提交
2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969
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 已提交
2970

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

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

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

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

**参数:**

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

**参数:**

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

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

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

**示例:**

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

X
xwb 已提交
3051 3052 3053 3054
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3055
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068
}
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 已提交
3069 3070
```

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

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

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

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

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

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

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

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

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

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

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

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

X
xwb 已提交
3103 3104 3105 3106
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3107
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119
}
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 已提交
3120

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

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

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

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

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

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

**参数:**

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

**错误码:**

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

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

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

var KeyBlob;
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3159
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180
}
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 已提交
3181

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

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

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

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

**参数:**

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

**返回值:**

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

**错误码:**

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

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

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

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

X
xwb 已提交
3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244
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 已提交
3245 3246 3247 3248 3249

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

**参数:**

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

**错误码:**

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

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

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

var KeyBlob;
var mac;
try {
    mac = cryptoFramework.createMac("SHA256");
} catch (error) {
3271
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
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 3320
}
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 已提交
3321

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

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

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

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

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

**返回值:**

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

**错误码:**

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

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

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

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

X
xwb 已提交
3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406
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 已提交
3407

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

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

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

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

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

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

**错误码:**

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

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

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

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

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

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

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

X
xwb 已提交
3446 3447 3448 3449 3450
**系统能力:** SystemCapability.Security.CryptoFramework

| 名称    | 类型   | 可读 | 可写 | 说明                 |
| ------- | ------ | ---- | ---- | -------------------- |
| algName<sup>10+</sup> | string | 是   | 否   | 代表当前使用的随机数生成算法,目前只支持“CTR_DRBG"。 |
W
wangyongzhong2 已提交
3451

X
xwb 已提交
3452
### generateRandom
W
wangyongzhong2 已提交
3453

X
xwb 已提交
3454 3455 3456
generateRandom(len: number, callback: AsyncCallback\<DataBlob>): void

异步生成指定长度的随机数。
W
wangyongzhong2 已提交
3457 3458 3459 3460 3461

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

**参数:**

X
xwb 已提交
3462 3463 3464 3465
| 参数名   | 类型                     | 必填 | 说明                 |
| -------- | ------------------------ | ---- | -------------------- |
| len      | number                   | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。            |
W
wangyongzhong2 已提交
3466

X
xwb 已提交
3467
**错误码:**
W
wangyongzhong2 已提交
3468

X
xwb 已提交
3469 3470 3471 3472 3473
| 错误码ID | 错误信息               |
| -------- | ---------------------- |
| 401 | invalid parameters.          |
| 17620001 | memory error.          |
| 17630001 | crypto operation error. |
W
wangyongzhong2 已提交
3474 3475 3476

**示例:**

X
xwb 已提交
3477
```js
W
wangyongzhong2 已提交
3478 3479
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3480 3481 3482 3483
var rand;
try {
    rand = cryptoFramework.createRandom();
} catch (error) {
3484
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3485 3486 3487 3488 3489 3490 3491 3492
}
rand.generateRandom(12, (err, randData) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    } else {
        console.error("[Callback]: generate random result: " + randData.data);
    }
});
W
wangyongzhong2 已提交
3493 3494
```

X
xwb 已提交
3495
### generateRandom
W
wangyongzhong2 已提交
3496

X
xwb 已提交
3497
generateRandom(len: number): Promise\<DataBlob>
W
wangyongzhong2 已提交
3498

X
xwb 已提交
3499
异步生成指定长度的随机数。
W
wangyongzhong2 已提交
3500 3501 3502

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

X
xwb 已提交
3503
**参数:**
W
wangyongzhong2 已提交
3504

X
xwb 已提交
3505 3506 3507
| 参数名 | 类型   | 必填 | 说明                                                   |
| ------ | ------ | ---- | ------------------------------------------------------ |
| len    | number | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
W
wangyongzhong2 已提交
3508

X
xwb 已提交
3509
**返回值:**
W
wangyongzhong2 已提交
3510

X
xwb 已提交
3511 3512 3513
| 类型               | 说明        |
| ------------------ | ----------- |
| Promise\<[DataBlob](#datablob)> | Promise对象。 |
W
wangyongzhong2 已提交
3514 3515 3516 3517 3518

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
3519 3520
| 401 | invalid parameters.          |
| 17620001 | memory error.           |
W
wangyongzhong2 已提交
3521 3522
| 17630001 | crypto operation error. |

X
xwb 已提交
3523 3524
**示例:**

X
xwb 已提交
3525
```js
X
xwb 已提交
3526 3527 3528 3529 3530 3531
import cryptoFramework from "@ohos.security.cryptoFramework"

var rand;
try {
    rand = cryptoFramework.createRandom();
} catch (error) {
3532
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543
}

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 已提交
3544

X
xwb 已提交
3545
generateRandomSync(len: number): DataBlob
W
wangyongzhong2 已提交
3546

X
xwb 已提交
3547
以同步方法生成指定长度的随机数。
W
wangyongzhong2 已提交
3548 3549 3550 3551 3552

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

**参数:**

X
xwb 已提交
3553 3554 3555
| 参数名 | 类型   | 必填 | 说明                 |
| ------ | ------ | ---- | -------------------- |
| len    | number | 是   | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 |
W
wangyongzhong2 已提交
3556 3557 3558

**返回值:**

X
xwb 已提交
3559 3560 3561
| 类型               | 说明        |
| ------------------ | ----------- |
|[DataBlob](#datablob) | 表示生成的随机数。 |
W
wangyongzhong2 已提交
3562 3563 3564 3565 3566

**错误码:**

| 错误码ID | 错误信息               |
| -------- | ---------------------- |
X
xwb 已提交
3567 3568
| 401 | invalid parameters.          |
| 17620001 | memory error.           |
W
wangyongzhong2 已提交
3569 3570
| 17630001 | crypto operation error. |

X
xwb 已提交
3571
**示例:**
W
wangyongzhong2 已提交
3572

X
xwb 已提交
3573
```js
W
wangyongzhong2 已提交
3574 3575
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3576 3577 3578 3579
var rand;
try {
    rand = cryptoFramework.createRandom();
} catch (error) {
3580
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3581 3582
}

X
xwb 已提交
3583
try {
X
xwb 已提交
3584
  let randData = rand.generateRandomSync(12);
X
xwb 已提交
3585 3586 3587 3588 3589 3590 3591 3592
  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 已提交
3593 3594
```

X
xwb 已提交
3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613
### setSeed

setSeed(seed: DataBlob): void

设置指定的种子。

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

| 参数名 | 类型     | 必填 | 说明         |
| ------ | -------- | ---- | ------------ |
| seed   | DataBlob | 是   | 设置的种子。 |

**错误码:**

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

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

X
xwb 已提交
3615
```js
W
wangyongzhong2 已提交
3616 3617
import cryptoFramework from "@ohos.security.cryptoFramework"

X
xwb 已提交
3618 3619 3620 3621
var rand;
try {
    rand = cryptoFramework.createRandom();
} catch (error) {
3622
    console.error("[Sync]: error code: " + error.code + ", message is: " + error.message);
X
xwb 已提交
3623 3624 3625 3626 3627 3628
}

rand.generateRandom(12, (err, randData) => {
    if (err) {
        console.error("[Callback] err: " + err.code);
    } else {
3629
        console.info("[Callback]: generate random result: " + randData.data);
X
xwb 已提交
3630 3631 3632
        try {
            rand.setSeed(randData);
        } catch (error) {
3633
            console.error("setSeed failed, errCode: " + error.code + ", errMsg: " + error.message);
X
xwb 已提交
3634 3635
        }
    }
W
wangyongzhong2 已提交
3636
});
X
xwb 已提交
3637
```