1# @ohos.security.cryptoFramework (加解密算法库框架) 2 3为屏蔽底层硬件和算法库,向上提供统一的密码算法库加解密相关接口。 4 5> **说明:** 6> 7> - 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 8 9## 导入模块 10 11```ts 12import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 13``` 14 15## Result 16 17 表示执行结果的枚举。 18 19 **系统能力:** SystemCapability.Security.CryptoFramework 20 21| 名称 | 值 | 说明 | 22| ------------------------------------- | -------- | ---------------------------- | 23| INVALID_PARAMS | 401 | 非法入参。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 24| NOT_SUPPORT | 801 | 操作不支持。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 | 25| ERR_OUT_OF_MEMORY | 17620001 | 内存错误。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 26| ERR_RUNTIME_ERROR | 17620002 | 运行时外部错误。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 | 27| ERR_CRYPTO_OPERATION | 17630001 | 调用三方算法库API出错。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 28 29## DataBlob 30 31buffer数组,提供blob数据类型。 32 33 **原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 34 35 **系统能力:** SystemCapability.Security.CryptoFramework 36 37| 名称 | 类型 | 可读 | 可写 | 说明 | 38| ---- | ---------- | ---- | ---- | ------ | 39| data | Uint8Array | 是 | 是 | 数据。 | 40 41> **说明:** 42> 43> Uint8Array类型数据表示8位无符号整数的数组。 44 45## ParamsSpec 46 47加解密参数,在进行对称加解密时需要构造其子类对象,并将子类对象传入[init()](#init-2)方法。 48 49适用于需要iv等参数的对称加解密模式(对于无iv等参数的模式如ECB模式,无需构造,在[init()](#init-2)中传入null即可)。 50 51**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 52 53**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 54 55API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 56 57| 名称 | 类型 | 可读 | 可写 | 说明 | 58| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 59| algName | string | 是 | 是 | 指明对称加解密参数的算法模式。可选值如下:<br/> - "IvParamsSpec": 适用于CBC\|CTR\|OFB\|CFB模式<br/> - "GcmParamsSpec": 适用于GCM模式<br/> - "CcmParamsSpec": 适用于CCM模式 | 60 61> **说明:** 62> 63> 由于[init()](#init-2)的params参数是ParamsSpec类型(父类),而实际需要传入具体的子类对象(如IvParamsSpec),因此在构造子类对象时应设置其父类ParamsSpec的algName参数,使算法库在init()时知道传入的是哪种子类对象。 64 65## IvParamsSpec 66 67加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。 68 69适用于CBC、CTR、OFB、CFB这些仅使用iv作为参数的加解密模式。 70 71**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 72 73**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 74 75API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 76 77| 名称 | 类型 | 可读 | 可写 | 说明 | 78| ---- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 79| iv | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数iv。常见取值如下:<br/>- AES的CBC\|CTR\|OFB\|CFB模式:iv长度为16字节<br/>- 3DES的CBC\|OFB\|CFB模式:iv长度为8字节<br/>- SM4<sup>10+</sup>的CBC\|CTR\|OFB\|CFB模式:iv长度为16字节。 | 80 81> **说明:** 82> 83> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 84 85## GcmParamsSpec 86 87加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。 88 89适用于GCM模式。 90 91**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 92 93**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 94 95API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 96 97| 名称 | 类型 | 可读 | 可写 | 说明 | 98| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 99| iv | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数iv,长度为1~16字节,常用为12字节。 | 100| aad | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数aad,长度为0~INT_MAX字节,常用为16字节。 | 101| authTag | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数authTag,长度为16字节。<br/>采用GCM模式加密时,需要获取[doFinal()](#dofinal-2)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob),取出其末尾16字节作为解密时[init()](#init-2)或[initSync()](#initsync12)方法的入参GcmParamsSpec中的的authTag。 | 102 103> **说明:** 104> 105> 1. 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 106> 2. 对于在1~16字节长度范围内的iv,加解密算法库不作额外限制,但其结果取决于底层openssl是否支持。 107> 3. 用户不需要使用aad参数或aad长度为0时,可以指定aad的data属性为空的Uint8Array,来构造GcmParamsSpec,写法为aad: { data: new Uint8Array() }。 108 109## CcmParamsSpec 110 111加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。 112 113适用于CCM模式。 114 115**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 116 117**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 118 119API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 120 121| 名称 | 类型 | 可读 | 可写 | 说明 | 122| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 123| iv | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数iv,长度为7字节。 | 124| aad | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数aad,长度为8字节。 | 125| authTag | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数authTag,长度为12字节。<br/>采用CCM模式加密时,需要获取[doFinal()](#dofinal-2)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob),取出其末尾12字节作为解密时[init()](#init-2)或[initSync()](#initsync12)方法的入参[CcmParamsSpec](#ccmparamsspec)中的authTag。 | 126 127> **说明:** 128> 129> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 130 131## CryptoMode 132 133表示加解密操作的枚举。 134 135**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 136 137**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 138 139API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 140 141| 名称 | 值 | 说明 | 142| ------------ | ---- | ------------------ | 143| ENCRYPT_MODE | 0 | 表示进行加密操作。 | 144| DECRYPT_MODE | 1 | 表示进行解密操作。 | 145 146## AsyKeySpecItem<sup>10+</sup> 147 148表示密钥参数的枚举。 149 150**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 151 152**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 153 154API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 155 156| 名称 | 值 | 说明 | 157| ------------ | ---- | ---------------- | 158| DSA_P_BN | 101 | DSA算法的素模数p。 | 159| DSA_Q_BN | 102 | DSA算法中密钥参数q(p-1的素因子)。 | 160| DSA_G_BN | 103 | DSA算法的参数g。 | 161| DSA_SK_BN | 104 | DSA算法的私钥sk。 | 162| DSA_PK_BN | 105 | DSA算法的公钥pk。 | 163| ECC_FP_P_BN | 201 | ECC算法中表示椭圆曲线Fp域的素数p。 | 164| ECC_A_BN | 202 | ECC算法中椭圆曲线的第一个系数a。 | 165| ECC_B_BN | 203 | ECC算法中椭圆曲线的第二个系数b。 | 166| ECC_G_X_BN | 204 | ECC算法中基点g的x坐标。 | 167| ECC_G_Y_BN | 205 | ECC算法中基点g的y坐标。 | 168| ECC_N_BN | 206 | ECC算法中基点g的阶n。 | 169| ECC_H_NUM | 207 | ECC算法中的余因子h。 | 170| ECC_SK_BN | 208 | ECC算法中的私钥sk。 | 171| ECC_PK_X_BN | 209 | ECC算法中,公钥pk(椭圆曲线上的一个点)的x坐标。 | 172| ECC_PK_Y_BN | 210 | ECC算法中,公钥pk(椭圆曲线上的一个点)的y坐标。 | 173| ECC_FIELD_TYPE_STR | 211 | ECC算法中,椭圆曲线的域类型(当前只支持Fp域)。 | 174| ECC_FIELD_SIZE_NUM | 212 | ECC算法中域的大小,单位为bits(注:对于Fp域,域的大小为素数p的bits长度)。 | 175| ECC_CURVE_NAME_STR | 213 | ECC算法中的SECG(Standards for Efficient Cryptography Group)曲线名称。 | 176| RSA_N_BN | 301 | RSA算法中的模数n。 | 177| RSA_SK_BN | 302 | RSA算法中的私钥sk(即私钥指数d)。 | 178| RSA_PK_BN | 303 | RSA算法中的公钥pk(即公钥指数e)。 | 179| DH_P_BN<sup>11+</sup> | 401 | DH算法中的素数p。 | 180| DH_G_BN<sup>11+</sup> | 402 | DH算法中的参数g。 | 181| DH_L_NUM<sup>11+</sup> | 403 | DH算法中私钥长度,单位为bit。 | 182| DH_SK_BN<sup>11+</sup> | 404 | DH算法中的私钥sk。 | 183| DH_PK_BN<sup>11+</sup> | 405 | DH算法中的公钥pk。 | 184| ED25519_SK_BN<sup>11+</sup> | 501 | ED25519算法中的私钥sk。 | 185| ED25519_PK_BN<sup>11+</sup> | 502 | ED25519算法中的公钥pk。 | 186| X25519_SK_BN<sup>11+</sup> | 601 | X25519算法中的私钥sk。 | 187| X25519_PK_BN<sup>11+</sup> | 602 | X25519算法中的公钥pk。 | 188 189## AsyKeySpecType<sup>10+</sup> 190 191表示密钥参数类型的枚举。 192 193**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 194 195**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 196 197API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 198 199| 名称 | 值 | 说明 | 200| ------------ | ---- | ---------------- | 201| COMMON_PARAMS_SPEC | 0 | 表示公私钥中包含的公共参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair-2)随机生成密钥对。 | 202| PRIVATE_KEY_SPEC | 1 | 表示私钥中包含的参数。使用此类型的参数可以调用[generatePriKey](#generateprikey)生成指定的私钥。 | 203| PUBLIC_KEY_SPEC | 2 | 表示公钥中包含的参数。使用此类型的参数可以调用[generatePubKey](#generatepubkey)生成指定的公钥。 | 204| KEY_PAIR_SPEC | 3 | 表示公私钥中包含的全量参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair-2)生成指定的密钥对。 | 205 206## CipherSpecItem<sup>10+</sup> 207 208表示加解密参数的枚举,这些加解密参数支持通过[setCipherSpec](#setcipherspec10)接口设置/通过[getCipherSpec](#getcipherspec10)接口获取。 209 210当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_MD_NAME_STR参数的支持,详细规格请参考[加解密规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md) 211 212**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 213 214**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 215 216API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 217 218| 名称 | 值 | 说明 | 219| ------------ | ---- | ---------------- | 220| OAEP_MD_NAME_STR | 100 | 表示RSA算法中,使用PKCS1_OAEP模式时,消息摘要功能的算法名。 | 221| OAEP_MGF_NAME_STR | 101 | 表示RSA算法中,使用PKCS1_OAEP模式时,掩码生成算法(目前仅支持MGF1)。 | 222| OAEP_MGF1_MD_STR | 102 | 表示RSA算法中,使用PKCS1_OAEP模式时,MGF1掩码生成功能的消息摘要算法。 | 223| OAEP_MGF1_PSRC_UINT8ARR | 103 | 表示RSA算法中,使用PKCS1_OAEP模式时,pSource的字节流。 | 224| SM2_MD_NAME_STR<sup>11+</sup> | 104 | 表示SM2算法中,使用的摘要算法名。 | 225 226## SignSpecItem<sup>10+</sup> 227 228表示签名验签参数的枚举,这些签名验签参数支持通过[setSignSpec](#setsignspec10)、[setVerifySpec](#setverifyspec10)接口设置/通过[getSignSpec](#getsignspec10)、[getVerifySpec](#getverifyspec10)接口获取。 229 230当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_USER_ID_UINT8ARR参数的支持,详细规格请参考[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md) 231 232**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 233 234**系统能力:** SystemCapability.Security.CryptoFramework.Signature 235 236API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 237 238| 名称 | 值 | 说明 | 239| ------------ | ---- | ---------------- | 240| PSS_MD_NAME_STR | 100 | 表示RSA算法中,使用PSS模式时,消息摘要功能的算法名。 | 241| PSS_MGF_NAME_STR | 101 | 表示RSA算法中,使用PSS模式时,掩码生成算法(目前仅支持MGF1)。 | 242| PSS_MGF1_MD_STR | 102 | 表示RSA算法中,使用PSS模式时,MGF1掩码生成功能的消息摘要参数。 | 243| PSS_SALT_LEN_NUM | 103 | 表示RSA算法中,使用PSS模式时,盐值的长度,长度以字节为单位。 | 244| PSS_TRAILER_FIELD_NUM | 104 | 表示RSA算法中,使用PSS模式时,用于编码操作的整数。 | 245| SM2_USER_ID_UINT8ARR<sup>11+</sup> | 105 | 表示SM2算法中,用户身份标识字段。 | 246 247## AsyKeySpec<sup>10+</sup> 248 249指定非对称密钥参数的基本接口,用于创建密钥生成器。在指定非对称密钥参数时需要构造其子类对象,并将子类对象传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。构造子类对象时,除了RSA密钥采用小端写法外,其他bigint类型的密钥参数均采用大端写法,并使用正数。 250 251**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 252 253**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 254 255API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 256 257| 名称 | 类型 | 可读 | 可写 | 说明 | 258| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 259| algName | string | 是 | 是 | 指定非对称密钥的算法名称,比如"RSA"、"DSA"、"ECC"、"SM2"、"Ed25519"、"X25519"、"DH"。 | 260| specType | [AsyKeySpecType](#asykeyspectype10) | 是 | 是 | 指定密钥参数类型,用于区分公/私钥参数。 | 261 262## DSACommonParamsSpec<sup>10+</sup> 263 264密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的公共参数,随机生成公/私钥。 265 266在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 267 268**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 269 270**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 271 272API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 273 274| 名称 | 类型 | 可读 | 可写 | 说明 | 275| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 276| p | bigint | 是 | 是 | 指定DSA算法的素模数p。 | 277| q | bigint | 是 | 是 | 指定DSA算法中密钥参数q(p-1的素因子)。 | 278| g | bigint | 是 | 是 | 指定DSA算法的参数g。 | 279 280## DSAPubKeySpec<sup>10+</sup> 281 282密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公钥包含的参数。 283 284在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 285 286**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 287 288**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 289 290API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 291 292| 名称 | 类型 | 可读 | 可写 | 说明 | 293| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 294| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 是 | 是 | 指定DSA算法中公私钥都包含的公共参数。 | 295| pk | bigint | 是 | 是 | 指定DSA算法的公钥。 | 296 297## DSAKeyPairSpec<sup>10+</sup> 298 299密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的全量参数。 300 301在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 302 303**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 304 305**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 306 307API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 308 309| 名称 | 类型 | 可读 | 可写 | 说明 | 310| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 311| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 是 | 是 | 指定DSA算法中公私钥都包含的公共参数。 | 312| sk | bigint | 是 | 是 | 指定DSA算法的私钥sk。 | 313| pk | bigint | 是 | 是 | 指定DSA算法的公钥pk。 | 314 315## ECField<sup>10+</sup> 316 317指定椭圆曲线的域。当前只支持Fp域。 318 319**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 320 321**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 322 323API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 324 325| 名称 | 类型 | 可读 | 可写 | 说明 | 326| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 327| fieldType | string | 是 | 是 | 指定椭圆曲线域的类型,当前只支持"Fp"。 | 328 329## ECFieldFp<sup>10+</sup> 330 331指定椭圆曲线素数域。是[ECField](#ecfield10)的子类。 332 333**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 334 335**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 336 337API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 338 339| 名称 | 类型 | 可读 | 可写 | 说明 | 340| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 341| p | bigint | 是 | 是 | 指定素数p。 | 342 343## Point<sup>10+</sup> 344 345指定椭圆曲线上的一个点。 346 347**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 348 349**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 350 351API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 352 353| 名称 | 类型 | 可读 | 可写 | 说明 | 354| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 355| x | bigint | 是 | 是 | 指定椭圆曲线上,点的x坐标。 | 356| y | bigint | 是 | 是 | 指定椭圆曲线上,点的y坐标。 | 357 358## ECCCommonParamsSpec<sup>10+</sup> 359 360密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的公共参数,随机生成公/私钥。 361 362在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 363 364**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 365 366**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 367 368API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 369 370| 名称 | 类型 | 可读 | 可写 | 说明 | 371| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 372| field | [ECField](#ecfield10) | 是 | 是 | 指定椭圆曲线的域(当前只支持Fp域)。 | 373| a | bigint | 是 | 是 | 指定椭圆曲线的第一个系数a。 | 374| b | bigint | 是 | 是 | 指定椭圆曲线的第二个系数b。 | 375| g | [Point](#point10) | 是 | 是 | 指定基点g。 | 376| n | bigint | 是 | 是 | 指定基点g的阶数n。 | 377| h | number | 是 | 是 | 指定余因子h。 | 378 379## ECCPriKeySpec<sup>10+</sup> 380 381密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中私钥包含的参数。 382 383在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 384 385**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 386 387**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 388 389API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 390 391| 名称 | 类型 | 可读 | 可写 | 说明 | 392| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 393| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是 | 是 | 指定ECC算法中公私钥都包含的公共参数。 | 394| sk | bigint | 是 | 是 | 指定ECC算法的私钥sk。 | 395 396## ECCPubKeySpec<sup>10+</sup> 397 398密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公钥包含的参数。 399 400在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 401 402**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 403 404**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 405 406API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 407 408| 名称 | 类型 | 可读 | 可写 | 说明 | 409| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 410| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是 | 是 | 指定ECC算法中公私钥都包含的公共参数。 | 411| pk | [Point](#point10) | 是 | 是 | 指定ECC算法的公钥pk。 | 412 413## ECCKeyPairSpec<sup>10+</sup> 414 415密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的全量参数。 416 417在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 418 419**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 420 421**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 422 423API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 424 425| 名称 | 类型 | 可读 | 可写 | 说明 | 426| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 427| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是 | 是 | 指定ECC算法中公私钥都包含的公共参数。 | 428| sk | bigint | 是 | 是 | 指定ECC算法的私钥sk。 | 429| pk | [Point](#point10) | 是 | 是 | 指定ECC算法的公钥pk。 | 430 431## RSACommonParamsSpec<sup>10+</sup> 432 433密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的公共参数,随机生成公/私钥。 434 435在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 436 437**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 438 439**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 440 441API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 442 443| 名称 | 类型 | 可读 | 可写 | 说明 | 444| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 445| n | bigint | 是 | 是 | 指定模数n。 | 446 447## RSAPubKeySpec<sup>10+</sup> 448 449密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公钥包含的参数。 450 451在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 452 453**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 454 455**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 456 457API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 458 459| 名称 | 类型 | 可读 | 可写 | 说明 | 460| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 461| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 是 | 是 | 指定RSA算法中公私钥都包含的公共参数。 | 462| pk | bigint | 是 | 是 | 指定RSA算法的公钥pk。 | 463 464## RSAKeyPairSpec<sup>10+</sup> 465 466密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的全量参数。 467 468在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 469 470**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 471 472**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 473 474API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 475 476| 名称 | 类型 | 可读 | 可写 | 说明 | 477| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 478| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 是 | 是 | 指定RSA算法中公私钥都包含的公共参数。 | 479| sk | bigint | 是 | 是 | 指定RSA算法的私钥sk。 | 480| pk | bigint | 是 | 是 | 指定RSA算法的公钥pk。 | 481 482## ED25519PriKeySpec<sup>11+</sup> 483 484密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中私钥包含的参数。 485 486在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 487 488**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 489 490**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 491 492API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 493 494| 名称 | 类型 | 可读 | 可写 | 说明 | 495| ---- | ------ | ---- | ---- | ------------------------- | 496| sk | bigint | 是 | 是 | 指定ED25519算法的私钥sk。 | 497 498## ED25519PubKeySpec<sup>11+</sup> 499 500密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中公钥包含的参数。 501 502在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 503 504**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 505 506**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 507 508API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 509 510| 名称 | 类型 | 可读 | 可写 | 说明 | 511| ---- | ------ | ---- | ---- | ------------------------- | 512| pk | bigint | 是 | 是 | 指定ED25519算法的公钥pk。 | 513 514## ED25519KeyPairSpec<sup>11+</sup> 515 516密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中公私钥包含的全量参数。 517 518在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 519 520**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 521 522**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 523 524API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 525 526| 名称 | 类型 | 可读 | 可写 | 说明 | 527| ---- | ------ | ---- | ---- | ------------------------- | 528| sk | bigint | 是 | 是 | 指定ED25519算法的私钥sk。 | 529| pk | bigint | 是 | 是 | 指定ED25519算法的公钥pk。 | 530 531## X25519PriKeySpec<sup>11+</sup> 532 533密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中私钥包含的参数。 534 535在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 536 537**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 538 539**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 540 541API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 542 543| 名称 | 类型 | 可读 | 可写 | 说明 | 544| ---- | ------ | ---- | ---- | ------------------------ | 545| sk | bigint | 是 | 是 | 指定X25519算法的私钥sk。 | 546 547## X25519PubKeySpec<sup>11+</sup> 548 549密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公钥包含的参数。 550 551在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 552 553**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 554 555**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 556 557API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 558 559| 名称 | 类型 | 可读 | 可写 | 说明 | 560| ---- | ------ | ---- | ---- | ------------------------ | 561| pk | bigint | 是 | 是 | 指定X25519算法的公钥pk。 | 562 563## X25519KeyPairSpec<sup>11+</sup> 564 565密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公私钥包含的全量参数。 566 567在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 568 569**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 570 571**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 572 573API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 574 575| 名称 | 类型 | 可读 | 可写 | 说明 | 576| ---- | ------ | ---- | ---- | ------------------------ | 577| sk | bigint | 是 | 是 | 指定X25519算法的私钥sk。 | 578| pk | bigint | 是 | 是 | 指定X25519算法的公钥pk。 | 579 580## DHCommonParamsSpec<sup>11+</sup> 581 582密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的参数。 583 584在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 585 586**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 587 588**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 589 590API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 591 592| 名称 | 类型 | 可读 | 可写 | 说明 | 593| ---- | ------ | ---- | ---- | ----------------------------------- | 594| p | bigint | 是 | 是 | 指定DH算法中大素数p。 | 595| g | bigint | 是 | 是 | 指定DH算法中参数g。 | 596| l | number | 是 | 是 | 指定DH算法中私钥的长度,单位为bit。 | 597 598## DHPriKeySpec<sup>11+</sup> 599 600密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中私钥包含的参数。 601 602在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 603 604**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 605 606**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 607 608API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 609 610| 名称 | 类型 | 可读 | 可写 | 说明 | 611| ------ | ------------------ | ---- | ---- | ------------------------------------ | 612| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是 | 是 | 指定DH算法中公私钥都包含的公共参数。 | 613| sk | bigint | 是 | 是 | 指定DH算法的私钥sk。 | 614 615## DHPubKeySpec<sup>11+</sup> 616 617密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公钥包含的参数。 618 619在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 620 621**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 622 623**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 624 625API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 626 627| 名称 | 类型 | 可读 | 可写 | 说明 | 628| ------ | ------------------ | ---- | ---- | ------------------------------------ | 629| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是 | 是 | 指定DH算法中公私钥都包含的公共参数。 | 630| pk | bigint | 是 | 是 | 指定DH算法的公钥pk。 | 631 632## DHKeyPairSpec<sup>11+</sup> 633 634密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的全量参数。 635 636在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 637 638**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 639 640**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 641 642API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 643 644| 名称 | 类型 | 可读 | 可写 | 说明 | 645| ------ | ------------------ | ---- | ---- | ------------------------------------ | 646| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是 | 是 | 指定DH算法中公私钥都包含的公共参数。 | 647| sk | bigint | 是 | 是 | 指定DH算法的私钥sk。 | 648| pk | bigint | 是 | 是 | 指定DH算法的公钥pk。 | 649 650## KdfSpec<sup>11+</sup> 651 652密钥派生函数参数,使用密钥派生函数进行密钥派生时,需要构建其子类对象并作为输入。 653 654**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 655 656**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 657 658API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 659 660| 名称 | 类型 | 可读 | 可写 | 说明 | 661| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 662| algName | string | 是 | 是 | 指明密钥派生函数的算法名,如"PBKDF2"。 | 663 664## PBKDF2Spec<sup>11+</sup> 665 666密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为PBKDF2密钥派生函数进行密钥派生时的输入。 667 668**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 669 670**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 671 672API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 673 674| 名称 | 类型 | 可读 | 可写 | 说明 | 675| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 676| password | string \| Uint8Array | 是 | 是 | 用户输入的原始密码。| 677| salt | Uint8Array | 是 | 是 | 盐值。 | 678| iterations | number | 是 | 是 | 迭代次数,需要为正整数。 | 679| keySize | number | 是 | 是 | 派生得到的密钥字节长度。 | 680 681> **说明:** 682> 683> password指的是原始密码,如果使用string类型,需要直接传入用于密钥派生的数据,而不是HexString、base64等字符串类型,同时需要确保该字符串为utf-8编码,否则派生结果会有差异。 684 685## HKDFSpec<sup>12+</sup> 686 687密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为HKDF密钥派生函数进行密钥派生时的输入。 688 689**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 690 691**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 692 693| 名称 | 类型 | 可读 | 可写 | 说明 | 694| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 695| key | string \| Uint8Array | 是 | 是 | 密钥材料。| 696| salt | Uint8Array | 是 | 是 | 盐值。 | 697| info | Uint8Array | 是 | 是 | 拓展信息。 | 698| keySize | number | 是 | 是 | 派生得到的密钥字节长度。 | 699 700> **说明:** 701> 702> key指的是用户输入的最初的密钥材料。info与salt是可选参数,根据模式的不同可以传空,但是不可不传。 703> 704> 例如:EXTRACT_AND_EXPAND模式需要输入全部的值,EXTRACT_ONLY模式info可以为空,在构建HKDFspec的时候,info传入null值。 705> 706> 默认的模式为EXTRACT_AND_EXPAND,"HKDF|SHA256|EXTRACT_AND_EXPAND"等价于"HKDF|SHA256"。 707 708## SM2CipherTextSpec<sup>12+</sup> 709 710SM2密文参数,使用SM2密文格式转换函数进行格式转换时,需要用到此对象。可以通过指定此参数,生成符合国密标准的ASN.1格式的SM2密文,反之,也可以从ASN.1格式的SM2密文中获取具体参数。 711 712**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 713 714**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 715 716| 名称 | 类型 | 可读 | 可写 | 说明 | 717| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 718| xCoordinate | bigint | 是 | 是 | x分量| 719| yCoordinate | bigint | 是 | 是 | y分量 | 720| cipherTextData | Uint8Array | 是 | 是 | 密文| 721| hashData | Uint8Array | 是 | 是 | 杂凑值 | 722 723> **说明:** 724> 725> - hashData为使用SM3算法对明文数据运算得到的杂凑值,其长度固定为256位。 726> 727> - cipherTextData是与明文等长的密文。 728> 729> - 在拼接生成C1C3C2格式的密文时,如果x分量(C1_X)或y分量(C1_Y)的长度不足32字节,需要在高位补0,使得x分量和y分量的长度均为32字节。 730 731## Key 732 733密钥(父类),在运行密码算法(如加解密)时需要提前生成其子类对象,并传入[Cipher](#cipher)实例的[init()](#init-2)方法。 734 735密钥可以通过密钥生成器来生成。 736 737### 属性 738 739**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 740 741**系统能力:** SystemCapability.Security.CryptoFramework.Key 742 743API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key 744 745| 名称 | 类型 | 可读 | 可写 | 说明 | 746| ------- | ------ | ---- | ---- | ---------------------------- | 747| format | string | 是 | 否 | 密钥的格式。 | 748| algName | string | 是 | 否 | 密钥对应的算法名(如果是对称密钥,则含密钥长度,否则不含密钥长度)。 | 749 750### getEncoded 751 752getEncoded(): DataBlob 753 754同步方法,获取密钥数据的字节流。密钥可以为对称密钥,公钥或者私钥。其中,公钥格式满足ASN.1语法、X.509规范、DER编码格式;私钥格式满足ASN.1语法,PKCS#8规范、DER编码方式。 755 756> **说明:** 757> 758> RSA算法使用密钥参数生成私钥时,私钥对象不支持getEncoded。 759 760**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 761 762**系统能力:** SystemCapability.Security.CryptoFramework.Key 763 764API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key 765 766**返回值:** 767 768| 类型 | 说明 | 769| --------------------- | ------------------------ | 770| [DataBlob](#datablob) | 用于查看密钥的具体内容。 | 771 772**错误码:** 773以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 774 775| 错误码ID | 错误信息 | 776| -------- | ---------------------- | 777| 801 | this operation is not supported. | 778| 17620001 | memory error. | 779| 17630001 | crypto operation error. | 780 781**示例:** 782 783```ts 784import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 785 786async function testGenerateAesKey() { 787 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256'); 788 let symKey = await symKeyGenerator.generateSymKey(); 789 let encodedKey = symKey.getEncoded(); 790 console.info('key hex:' + encodedKey.data); 791} 792``` 793 794## SymKey 795 796对称密钥,是[Key](#key)的子类,在对称加解密时需要将其对象传入[Cipher](#cipher)实例的[init()](#init-2)方法使用。 797 798对称密钥可以通过对称密钥生成器[SymKeyGenerator](#symkeygenerator)来生成。 799 800### clearMem 801 802clearMem(): void 803 804同步方法,将系统底层内存中的的密钥内容清零。建议在不再使用对称密钥实例时,调用本函数,避免内存中密钥数据存留过久。 805 806**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 807 808**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 809 810API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 811 812**示例:** 813 814<!--code_no_check--> 815```ts 816let key: cryptoFramework.SymKey; // The key is generated by a symKeyGenerator. The generation process is omitted here. 817let encodedKey = key.getEncoded(); 818console.info('key blob: '+ encodedKey.data); // Display key content. 819key.clearMem(); 820encodedKey = key.getEncoded(); 821console.info('key blob:' + encodedKey.data); // Display all 0s. 822``` 823 824## PubKey 825 826公钥,是[Key](#key)的子类,在非对称加解密、验签、密钥协商时需要将其对象作为输入使用。 827 828公钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 829 830### getAsyKeySpec<sup>10+</sup> 831 832getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number 833 834同步方法,获取密钥参数。 835 836**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 837 838**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 839 840API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 841 842**参数:** 843 844| 参数名 | 类型 | 必填 | 说明 | 845| ---- | --------------------- | ---- | -------------------- | 846| itemType | [AsyKeySpecItem](#asykeyspecitem10) | 是 | 指定的密钥参数。 | 847 848**返回值:** 849 850| 类型 | 说明 | 851| --------------------------- | --------------------------------- | 852| bigint \| string \| number | 用于查看密钥参数的具体内容。 | 853 854**错误码:** 855以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 856 857| 错误码ID | 错误信息 | 858| -------- | ---------------------- | 859| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 860| 17620001 | memory error. | 861| 17630001 | crypto operation error. | 862 863**示例:** 864 865<!--code_no_check--> 866```ts 867let key: cryptoFramework.PubKey; // key is a public key object. The generation process is omitted here. 868let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN); 869console.info('ecc item --- p: ' + p.toString(16)); 870``` 871 872### getEncodedDer<sup>12+</sup> 873 874getEncodedDer(format: string): DataBlob 875 876支持根据指定的密钥格式(如采用哪个规范、是否压缩等),获取满足ASN.1语法、DER编码的公钥数据。当前仅支持获取ECC压缩/非压缩格式的公钥数据。 877 878> **说明:** 879> 880> 本接口和[Key.getEncoded()](#getencoded)的区别是:<br/> 881> 1. 本接口可根据入参决定数据的输出格式。 882> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式,生成的数据格式与原始数据格式保持一致。(原始数据格式,指通过[convertKey](#convertkey-3)接口生成密钥对象时的数据格式)。 883 884**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 885 886**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 887 888**参数:** 889 890| 参数名 | 类型 | 必填 | 说明 | 891| ---- | --------------------- | ---- | -------------------- | 892| format | string | 是 | 用于指定当前密钥格式,取值仅支持"X509\|COMPRESSED"和"X509\|UNCOMPRESSED"。 | 893 894**返回值:** 895 896| 类型 | 说明 | 897| --------------------------- | --------------------------------- | 898| [DataBlob](#datablob) | 返回指定密钥格式的,满足ASN.1语法、DER编码的公钥数据。 | 899 900**错误码:** 901以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 902 903| 错误码ID | 错误信息 | 904| -------- | ---------------------- | 905| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 906| 17620001 | memory error. | 907| 17630001 | crypto operation error. | 908 909**示例:** 910 911<!--code_no_check--> 912```ts 913let key: cryptoFramework.PubKey; // Key is a public key object. The generation process is omitted here. 914let returnBlob = key.getEncodedDer('X509|UNCOMPRESSED'); 915console.info('returnBlob data:' + returnBlob.data); 916``` 917 918### getEncodedPem<sup>12+</sup> 919 920getEncodedPem(format: string): string 921 922同步方法,获取密钥数据的字符串。密钥可以为RSA公钥或者私钥。其中,公钥格式满足X.509规范、PKCS#1规范和PEM编码格式。 923 924**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 925 926**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 927 928**参数:** 929 930| 参数名 | 类型 | 必填 | 说明 | 931| ---- | --------------------- | ---- | -------------------- | 932| format | string | 是 | 指定的获取密钥字符串的编码格式。其中,公钥可为'PKCS1' 或'X509'格式。| 933 934**返回值:** 935 936| 类型 | 说明 | 937| --------------------------- | --------------------------------- | 938| string | 用于获取指定密钥格式的具体内容。 | 939 940**错误码:** 941以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 942 943| 错误码ID | 错误信息 | 944| -------- | ---------------------- | 945| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 946| 17620001 | memory error. | 947| 17630001 | crypto operation error. | 948 949**示例:** 950 951```ts 952import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 953 954let publicPkcs1Str1024: string = 955 "-----BEGIN RSA PUBLIC KEY-----\n" 956 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 957 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 958 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 959 + "-----END RSA PUBLIC KEY-----\n"; 960 961function TestPubKeyPkcs1ToX509BySync1024() { 962 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 963 let keyPair = rsaGenerator.convertPemKeySync(publicPkcs1Str1024, null); 964 let pubPemKey = keyPair.pubKey; 965 let pubString = pubPemKey.getEncodedPem('X509'); 966 console.info("[sync]TestPubKeyPkcs1ToX509BySync1024 pubString output is " + pubString); 967} 968``` 969 970## PriKey 971 972私钥,是[Key](#key)的子类,在非对称加解密、签名、密钥协商时需要将其作为输入使用。 973 974私钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 975 976### clearMem 977 978clearMem(): void 979 980同步方法,将系统底层内存中的的密钥内容清零。 981 982**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 983 984**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 985 986API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 987 988**示例:** 989 990<!--code_no_check--> 991```ts 992let key: cryptoFramework.PriKey; // The key is a private key generated by the asymmetric key generator. The generation process is omitted here. 993key.clearMem(); // For the asymmetric private key, clearMem() releases the internal key struct. After clearMem is executed, getEncoded() is not supported. 994``` 995 996### getAsyKeySpec<sup>10+</sup> 997 998getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number 999 1000同步方法,获取密钥参数。 1001 1002**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1003 1004**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1005 1006API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1007 1008**参数:** 1009 1010| 参数名 | 类型 | 必填 | 说明 | 1011| ---- | --------------------- | ---- | -------------------- | 1012| itemType | [AsyKeySpecItem](#asykeyspecitem10) | 是 | 指定的密钥参数类型。 | 1013 1014**返回值:** 1015 1016| 类型 | 说明 | 1017| --------------------------- | --------------------------------- | 1018| bigint \| string \| number | 用于查看密钥参数的具体内容。 | 1019 1020**错误码:** 1021以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1022 1023| 错误码ID | 错误信息 | 1024| -------- | ---------------------- | 1025| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1026| 17620001 | memory error. | 1027| 17630001 | crypto operation error. | 1028 1029**示例:** 1030 1031<!--code_no_check--> 1032```ts 1033let key: cryptoFramework.PriKey; // key is a private key object. The generation process is omitted here. 1034let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN); 1035console.info('ecc item --- p: ' + p.toString(16)); 1036``` 1037### getEncodedDer<sup>12+</sup> 1038 1039getEncodedDer(format: string): DataBlob 1040 1041支持根据指定的密钥格式(如采用哪个规范),获取满足ASN.1语法、DER编码的私钥数据。当前仅支持获取PKCS8格式的ecc私钥数据。 1042 1043> **说明:** 1044> 1045> 本接口和[Key.getEncoded()](#getencoded)的区别是:<br/> 1046> 1. 本接口可根据入参决定数据的输出格式,当前支持获取PKCS8格式的ecc私钥数据。 1047> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式。 1048 1049**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1050 1051**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1052 1053**参数:** 1054 1055| 参数名 | 类型 | 必填 | 说明 | 1056| ---- | --------------------- | ---- | -------------------- | 1057| format | string | 是 | 用于指定当前密钥格式,取值当前仅支持"PKCS8"。 | 1058 1059**返回值:** 1060 1061| 类型 | 说明 | 1062| --------------------------- | --------------------------------- | 1063| [DataBlob](#datablob) | 返回指定密钥格式的,满足ASN.1语法、DER编码的ecc私钥数据。 | 1064 1065**错误码:** 1066以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1067 1068| 错误码ID | 错误信息 | 1069| -------- | ---------------------- | 1070| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1071| 17620001 | memory error. | 1072| 17630001 | crypto operation error. | 1073 1074**示例:** 1075 1076<!--code_no_check--> 1077```ts 1078let key: cryptoFramework.PriKey; // key is a private key object. The generation process is omitted here. 1079let returnBlob = key.getEncodedDer('PKCS8'); 1080console.info('returnBlob data:' + returnBlob.data); 1081``` 1082 1083### getEncodedPem<sup>12+</sup> 1084 1085getEncodedPem(format: string): string 1086 1087同步方法,获取密钥数据的字符串。密钥可以为RSA公钥或者私钥。其中,私钥格式满足PKCS#8规范、PKCS#1规范和PEM编码方式。 1088 1089**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1090 1091**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1092 1093**参数:** 1094 1095| 参数名 | 类型 | 必填 | 说明 | 1096| ---- | --------------------- | ---- | -------------------- | 1097| format | string | 是 | 指定的获取密钥字符串的编码格式。其中,私钥可为'PKCS1' 或'PKCS8'格式。| 1098 1099**返回值:** 1100 1101| 类型 | 说明 | 1102| --------------------------- | --------------------------------- | 1103| string | 用于获取指定密钥格式的具体内容。 | 1104 1105**错误码:** 1106以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1107 1108| 错误码ID | 错误信息 | 1109| -------- | ---------------------- | 1110| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1111| 17620001 | memory error. | 1112| 17630001 | crypto operation error. | 1113 1114**示例:** 1115 1116```ts 1117import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1118 1119let priKeyPkcs1Str1024: string = 1120 "-----BEGIN RSA PRIVATE KEY-----\n" 1121 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 1122 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 1123 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 1124 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 1125 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 1126 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 1127 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 1128 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 1129 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 1130 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 1131 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 1132 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 1133 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 1134 + "-----END RSA PRIVATE KEY-----\n"; 1135 1136function TestPriKeyPkcs1ToPkcs8BySync1024() { 1137 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 1138 let keyPair = rsaGenerator.convertPemKeySync(null, priKeyPkcs1Str1024); 1139 let priPemKey = keyPair.priKey; 1140 let priString = priPemKey.getEncodedPem('PKCS8'); 1141 console.info("[sync]TestPriKeyPkcs1ToPkcs8BySync1024 priString output is " + priString); 1142} 1143``` 1144 1145## KeyPair 1146 1147非对称密钥对,包含:公钥与私钥。 1148 1149可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 1150 1151> **说明:** 1152> 1153> KeyPair对象中的pubKey对象和priKey对象,作为KeyPair对象中的一个参数存在,当离开KeyPair对象作用域时,其内部对象可能被析构。 1154> 1155> 业务方使用时应持有KeyPair对象的引用,而非内部pubKey或priKey对象的引用。 1156 1157### 属性 1158 1159**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1160 1161**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1162 1163API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1164 1165| 名称 | 类型 | 可读 | 可写 | 说明 | 1166| ------- | ------ | ---- | ---- | ------------ | 1167| priKey | [PriKey](#prikey) | 是 | 否 | 私钥。 | 1168| pubKey | [PubKey](#pubkey) | 是 | 否 | 公钥。 | 1169 1170## cryptoFramework.createSymKeyGenerator 1171 1172createSymKeyGenerator(algName: string): SymKeyGenerator 1173 1174通过指定算法名称的字符串,获取相应的对称密钥生成器实例。 1175 1176支持的规格详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)。 1177 1178**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1179 1180**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1181 1182API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1183 1184**参数:** 1185 1186| 参数名 | 类型 | 必填 | 说明 | 1187| ------- | ------ | ---- | ------------------------------------------------------------ | 1188| algName | string | 是 | 待生成对称密钥生成器的算法名称。<br/>具体取值详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)一节中的“字符串参数”。 | 1189 1190**返回值:** 1191 1192| 类型 | 说明 | 1193| ----------------------------------- | -------------------------- | 1194| [SymKeyGenerator](#symkeygenerator) | 返回对称密钥生成器的对象。 | 1195 1196**错误码:** 1197以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1198 1199| 错误码ID | 错误信息 | 1200| -------- | ---------------------- | 1201| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1202| 801 | this operation is not supported. | 1203 1204**示例:** 1205 1206```ts 1207import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1208 1209let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1210``` 1211 1212## SymKeyGenerator 1213 1214对称密钥生成器。 1215 1216在使用该类的方法前,需要先使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)方法构建一个SymKeyGenerator实例。 1217 1218### 属性 1219 1220**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1221 1222**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1223 1224API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1225 1226| 名称 | 类型 | 可读 | 可写 | 说明 | 1227| ------- | ------ | ---- | ---- | ------------------------------ | 1228| algName | string | 是 | 否 | 对称密钥生成器指定的算法名称。 | 1229 1230### generateSymKey 1231 1232generateSymKey(callback: AsyncCallback\<SymKey>): void 1233 1234异步获取对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。 1235 1236必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1237 1238目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1239 1240> **说明:** 1241> 1242> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如指定“HMAC|SHA256”会随机生成256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKey](#convertkey)方式生成对称密钥数据。 1243 1244**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1245 1246**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1247 1248API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1249 1250**参数:** 1251 1252| 参数名 | 类型 | 必填 | 说明 | 1253| -------- | --------------------------------- | ---- | ------------------------------------------------------------ | 1254| callback | AsyncCallback\<[SymKey](#symkey)> | 是 | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 | 1255 1256**错误码:** 1257以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1258 1259| 错误码ID | 错误信息 | 1260| -------- | ------------- | 1261| 17620001 | memory error. | 1262 1263**示例:** 1264 1265```ts 1266import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1267 1268let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1269 symKeyGenerator.generateSymKey((err, symKey) => { 1270 console.info('Generate symKey success, algName:' + symKey.algName); 1271 }); 1272``` 1273 1274### generateSymKey 1275 1276generateSymKey(): Promise\<SymKey> 1277 1278异步获取该对称密钥生成器随机生成的密钥,通过Promise获取结果。 1279 1280必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1281 1282目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1283 1284**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1285 1286**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1287 1288API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1289 1290**返回值:** 1291 1292| 类型 | 说明 | 1293| --------------------------- | --------------------------------- | 1294| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 | 1295 1296**错误码:** 1297以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1298 1299| 错误码ID | 错误信息 | 1300| -------- | ------------- | 1301| 17620001 | memory error. | 1302 1303**示例:** 1304 1305```ts 1306import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1307import { BusinessError } from '@kit.BasicServicesKit'; 1308 1309let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 1310 symKeyGenerator.generateSymKey() 1311 .then(symKey => { 1312 console.info('Generate symKey success, algName: ' + symKey.algName); 1313 }).catch((error: BusinessError) => { 1314 console.error(`Generate symKey failed, ${error.code}, ${error.message}`); 1315 }); 1316``` 1317 1318### generateSymKeySync<sup>12+</sup> 1319 1320generateSymKeySync(): SymKey 1321 1322同步获取对称密钥生成器随机生成的密钥。 1323 1324必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1325 1326目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1327 1328> **说明:** 1329> 1330> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如指定“HMAC|SHA256”会随机生成256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKeySync](#convertkeysync12)方式生成对称密钥数据。 1331 1332**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1333 1334**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1335 1336**错误码:** 1337以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1338 1339| 错误码ID | 错误信息 | 1340| -------- | ------------- | 1341| 17620001 | memory error. | 1342 1343**示例:** 1344 1345```ts 1346import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1347 1348function testGenerateSymKeySync() { 1349 // 创建SymKeyGenerator实例 1350 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256'); 1351 // 使用密钥生成器随机生成对称密钥 1352 let key = symKeyGenerator.generateSymKeySync(); 1353 let encodedKey = key.getEncoded(); 1354 console.info('key hex:' + encodedKey.data); 1355} 1356``` 1357 1358### convertKey 1359 1360convertKey(key: DataBlob, callback: AsyncCallback\<SymKey>): void 1361 1362异步根据指定数据生成对称密钥,通过注册回调函数获取结果。 1363 1364必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1365 1366> **说明:** 1367> 1368> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如传入SHA256对应256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据。 1369 1370**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1371 1372**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1373 1374API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1375 1376**参数:** 1377 1378| 参数名 | 类型 | 必填 | 说明 | 1379| -------- | ------------------- | ---- | ---------------------| 1380| key | [DataBlob](#datablob) | 是 | 指定的对称密钥材料。 | 1381| callback | AsyncCallback\<[SymKey](#symkey)> | 是 | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 | 1382 1383**错误码:** 1384以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1385 1386| 错误码ID | 错误信息 | 1387| -------- | --------------------------------------------------- | 1388| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1389| 17620001 | memory error. | 1390 1391**示例:** 1392 1393```ts 1394import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1395 1396function genKeyMaterialBlob(): cryptoFramework.DataBlob { 1397 let arr = [ 1398 0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56, 1399 0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c, 1400 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes) 1401 let keyMaterial = new Uint8Array(arr); 1402 return { data: keyMaterial }; 1403} 1404 1405function testConvertKey() { 1406 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1407 let keyMaterialBlob = genKeyMaterialBlob(); 1408 symKeyGenerator.convertKey(keyMaterialBlob, (err, symKey) => { 1409 console.info('Convert symKey success, algName: ' + symKey.algName); 1410 }); 1411} 1412``` 1413 1414### convertKey 1415 1416convertKey(key: DataBlob): Promise\<SymKey> 1417 1418异步根据指定数据生成对称密钥,通过Promise获取结果。 1419 1420必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1421 1422**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1423 1424**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1425 1426API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1427 1428**参数:** 1429 1430| 参数名 | 类型 | 必填 | 说明 | 1431| ---- | --------------------- | ---- | -------------------- | 1432| key | [DataBlob](#datablob) | 是 | 指定的密钥材料数据。 | 1433 1434**返回值:** 1435 1436| 类型 | 说明 | 1437| --------------------------- | --------------------------------- | 1438| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 | 1439 1440**错误码:** 1441以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1442 1443| 错误码ID | 错误信息 | 1444| -------- | --------------------------------------------- | 1445| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1446| 17620001 | memory error. | 1447 1448**示例:** 1449 1450```ts 1451import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1452import { BusinessError } from '@kit.BasicServicesKit'; 1453 1454function genKeyMaterialBlob(): cryptoFramework.DataBlob { 1455 let arr = [ 1456 0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56, 1457 0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c, 1458 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes) 1459 let keyMaterial = new Uint8Array(arr); 1460 return { data: keyMaterial }; 1461} 1462 1463function testConvertKey() { 1464 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1465 let keyMaterialBlob = genKeyMaterialBlob(); 1466 symKeyGenerator.convertKey(keyMaterialBlob) 1467 .then(symKey => { 1468 console.info('Convert symKey success, algName:' + symKey.algName); 1469 }).catch((error: BusinessError) => { 1470 console.error(`Convert symKey failed, ${error.code}, ${error.message}`); 1471 }); 1472} 1473``` 1474 1475### convertKeySync<sup>12+</sup> 1476 1477convertKeySync(key: DataBlob): SymKey 1478 1479同步根据指定数据生成对称密钥。 1480 1481必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1482 1483> **说明:** 1484> 1485> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如传入SHA256对应256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据。 1486 1487**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1488 1489**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1490 1491**参数:** 1492 1493| 参数名 | 类型 | 必填 | 说明 | 1494| -------- | ------------------- | ---- | ---------------------| 1495| key | [DataBlob](#datablob) | 是 | 指定的对称密钥材料。 | 1496 1497**错误码:** 1498以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1499 1500| 错误码ID | 错误信息 | 1501| -------- | --------------------------------------------------- | 1502| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1503| 17620001 | memory error. | 1504 1505**示例:** 1506 1507```ts 1508import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1509import { buffer } from '@kit.ArkTS'; 1510 1511function testConvertKeySync() { 1512 // 对称密钥长度为64字节,512比特 1513 let keyMessage = '87654321abcdefgh87654321abcdefgh87654321abcdefgh87654321abcdefgh'; 1514 let keyBlob: cryptoFramework.DataBlob = { 1515 data : new Uint8Array(buffer.from(keyMessage, 'utf-8').buffer) 1516 } 1517 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC'); 1518 let key = symKeyGenerator.convertKeySync(keyBlob); 1519 let encodedKey = key.getEncoded(); 1520 console.info('key encoded data:' + encodedKey.data); 1521} 1522``` 1523 1524## cryptoFramework.createAsyKeyGenerator 1525 1526createAsyKeyGenerator(algName: string): AsyKeyGenerator 1527 1528通过指定算法名称的字符串,获取相应的非对称密钥生成器实例。 1529 1530支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。 1531 1532**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1533 1534**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1535 1536API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1537 1538**参数:** 1539 1540| 参数名 | 类型 | 必填 | 说明 | 1541| ------- | ------ | ---- | -------------------------------- | 1542| algName | string | 是 | 待生成对称密钥生成器的算法名称。 | 1543 1544**返回值:** 1545 1546| 类型 | 说明 | 1547| --------------- | ---------------------------- | 1548| [AsyKeyGenerator](#asykeygenerator) | 返回非对称密钥生成器的对象。 | 1549 1550**错误码:** 1551以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1552 1553| 错误码ID | 错误信息 | 1554| -------- | ---------------------- | 1555| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1556| 801 | this operation is not supported. | 1557| 17620001 | memory error. | 1558 1559**示例:** 1560 1561```ts 1562import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1563 1564let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1565``` 1566 1567## AsyKeyGenerator 1568 1569非对称密钥生成器。在使用该类的方法前,需要先使用createAsyKeyGenerator()方法构建一个AsyKeyGenerator实例。 1570 1571### 属性 1572 1573**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1574 1575**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1576 1577API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1578 1579| 名称 | 类型 | 可读 | 可写 | 说明 | 1580| ------- | ------ | ---- | ---- | -------------------------------- | 1581| algName | string | 是 | 否 | 非对称密钥生成器指定的算法名称。 | 1582 1583### generateKeyPair 1584 1585generateKeyPair(callback: AsyncCallback\<KeyPair>): void 1586 1587异步获取非对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。 1588 1589**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1590 1591**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1592 1593API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1594 1595**参数:** 1596 1597| 参数名 | 类型 | 必填 | 说明 | 1598| -------- | ----------------------- | ---- | ------------------------------ | 1599| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 1600 1601**错误码:** 1602以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1603 1604| 错误码ID | 错误信息 | 1605| -------- | ---------------------- | 1606| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types;| 1607| 17620001 | memory error. | 1608| 17630001 | crypto operation error. | 1609 1610**示例:** 1611 1612```ts 1613import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1614 1615let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1616asyKeyGenerator.generateKeyPair((err, keyPair) => { 1617 if (err) { 1618 console.error("generateKeyPair: error."); 1619 return; 1620 } 1621 console.info('generateKeyPair: success.'); 1622}) 1623``` 1624 1625### generateKeyPair 1626 1627generateKeyPair(): Promise\<KeyPair> 1628 1629异步获取该非对称密钥生成器随机生成的密钥,通过Promise获取结果。 1630 1631**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1632 1633**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1634 1635API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1636 1637**返回值:** 1638 1639| 类型 | 说明 | 1640| ----------------- | --------------------------------- | 1641| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 1642 1643**错误码:** 1644以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1645 1646| 错误码ID | 错误信息 | 1647| -------- | ---------------------- | 1648| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1649| 17620001 | memory error. | 1650| 17630001 | crypto operation error. | 1651 1652**示例:** 1653 1654```ts 1655import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1656import { BusinessError } from '@kit.BasicServicesKit'; 1657 1658let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1659let keyGenPromise = asyKeyGenerator.generateKeyPair(); 1660keyGenPromise.then(keyPair => { 1661 console.info('generateKeyPair success.'); 1662}).catch((error: BusinessError) => { 1663 console.error("generateKeyPair error."); 1664}); 1665``` 1666 1667### generateKeyPairSync<sup>12+</sup> 1668 1669generateKeyPairSync(): KeyPair 1670 1671同步获取该非对称密钥生成器随机生成的密钥。 1672 1673**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1674 1675**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1676 1677**返回值:** 1678 1679| 类型 | 说明 | 1680| ----------------- | --------------------------------- | 1681| [KeyPair](#keypair) | 非对称密钥。 | 1682 1683**错误码:** 1684以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1685 1686| 错误码ID | 错误信息 | 1687| -------- | ---------------------- | 1688| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1689| 17620001 | memory error. | 1690| 17630001 | crypto operation error. | 1691 1692**示例:** 1693 1694```ts 1695import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1696 1697let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1698try { 1699 let keyPairData = asyKeyGenerator.generateKeyPairSync(); 1700 if (keyPairData != null) { 1701 console.info('[Sync]: key pair success'); 1702 } else { 1703 console.error("[Sync]: get key pair result fail!"); 1704 } 1705} catch (e) { 1706 console.error(`sync error, ${e.code}, ${e.message}`); 1707} 1708``` 1709 1710### convertKey 1711 1712convertKey(pubKey: DataBlob | null, priKey: DataBlob | null, callback: AsyncCallback\<KeyPair\>): void 1713 1714异步获取指定数据生成非对称密钥,通过注册回调函数获取结果。详情请看下方**密钥转换说明**。 1715 1716**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1717 1718**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1719 1720API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1721 1722**参数:** 1723 1724| 参数名 | 类型 | 必填 | 说明 | 1725| -------- | ----------- | ---- | ------------------------------ | 1726| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1727| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1728| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 1729 1730**错误码:** 1731以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1732 1733| 错误码ID | 错误信息 | 1734| -------- | ---------------------- | 1735| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1736| 17620001 | memory error. | 1737| 17630001 | crypto operation error. | 1738 1739**示例:** 1740 1741```ts 1742import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1743 1744let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]); 1745let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]); 1746let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据 1747let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据 1748let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1749asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 1750 if (err) { 1751 console.error("convertKey: error."); 1752 return; 1753 } 1754 console.info('convertKey: success.'); 1755}); 1756``` 1757 1758### convertKey 1759 1760convertKey(pubKey: DataBlob | null, priKey: DataBlob | null): Promise\<KeyPair> 1761 1762异步获取指定数据生成非对称密钥,通过Promise获取结果。详情请看下方**密钥转换说明**。 1763 1764**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1765 1766**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1767 1768API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1769 1770**参数:** 1771 1772| 参数名 | 类型 | 必填 | 说明 | 1773| ------ | -------- | ---- | ---------------- | 1774| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1775| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1776 1777**返回值:** 1778 1779| 类型 | 说明 | 1780| ----------------- | --------------------------------- | 1781| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 1782 1783**错误码:** 1784以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1785 1786| 错误码ID | 错误信息 | 1787| -------- | ---------------------- | 1788| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1789| 17620001 | memory error. | 1790| 17630001 | crypto operation error. | 1791 1792**示例:** 1793 1794```ts 1795import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1796import { BusinessError } from '@kit.BasicServicesKit'; 1797 1798let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]); 1799let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]); 1800let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据 1801let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据 1802let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1803let keyGenPromise = asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob); 1804keyGenPromise.then(keyPair => { 1805 console.info('convertKey success.'); 1806}).catch((error: BusinessError) => { 1807 console.error("convertKey error."); 1808}); 1809``` 1810 1811### convertKeySync<sup>12+</sup> 1812 1813convertKeySync(pubKey: DataBlob | null, priKey: DataBlob | null): KeyPair 1814 1815同步获取指定数据生成非对称密钥。详情请看下方**密钥转换说明**。 1816 1817**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1818 1819**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1820 1821**参数:** 1822 1823| 参数名 | 类型 | 必填 | 说明 | 1824| ------ | -------- | ---- | ---------------- | 1825| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1826| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1827 1828**返回值:** 1829 1830| 类型 | 说明 | 1831| ----------------- | --------------------------------- | 1832| [KeyPair](#keypair) | 非对称密钥。 | 1833 1834**错误码:** 1835以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1836 1837| 错误码ID | 错误信息 | 1838| -------- | ---------------------- | 1839| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1840| 17620001 | memory error. | 1841| 17630001 | crypto operation error. | 1842 1843**示例:** 1844 1845```ts 1846import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1847 1848let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]); 1849let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]); 1850let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据 1851let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据 1852let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1853try { 1854 let keyPairData = asyKeyGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 1855 if (keyPairData != null) { 1856 console.info('[Sync]: key pair success'); 1857 } else { 1858 console.error("[Sync]: convert key pair result fail!"); 1859 } 1860} catch (e) { 1861 console.error(`sync error, ${e.code}, ${e.message}`); 1862} 1863``` 1864 1865**密钥转换说明** 1866 18671. 非对称密钥(RSA、ECC、DSA)的公钥和私钥调用getEncoded()方法后,分别返回X.509格式和PKCS#8格式的二进制数据,其中对于ecc私钥,返回的是RFC5915定义格式。上述数据可用于跨应用传输或持久化存储。 18682. 当调用convertKey方法将外来二进制数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、DER编码格式,私钥应满足ASN.1语法、PKCS#8规范、DER编码格式。 18693. convertKey方法中,公钥和密钥二进制数据非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。 18704. convertKey或convertKeySync方法将外来二进制数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。 1871 1872### convertPemKey<sup>12+</sup> 1873 1874convertPemKey(pubKey: string | null, priKey: string | null): Promise\<KeyPair> 1875 1876异步获取指定数据生成非对称密钥,通过Promise获取结果。 1877 1878> **说明:** 1879> 1. 当调用convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、PEM编码格式,私钥应满足ASN.1语法、PKCS#8规范、PEM编码格式。 1880> 2. convertPemKey方法中,公钥和私钥字符串数据为非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。 1881> 3. convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。 1882 1883**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1884 1885**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1886 1887**参数:** 1888 1889| 参数名 | 类型 | 必填 | 说明 | 1890| ------ | -------- | ---- | ---------------- | 1891| pubKey | string \| null | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。| 1892| priKey | string \| null | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。| 1893 1894**返回值:** 1895 1896| 类型 | 说明 | 1897| ----------------- | --------------------------------- | 1898| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 1899 1900**错误码:** 1901以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1902 1903| 错误码ID | 错误信息 | 1904| -------- | ---------------------- | 1905| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1906| 17620001 | memory error. | 1907| 17630001 | crypto operation error. | 1908 1909**示例:** 1910 1911```ts 1912import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1913import { BusinessError } from '@kit.BasicServicesKit'; 1914 1915let priKeyPkcs1Str1024: string = 1916 "-----BEGIN RSA PRIVATE KEY-----\n" 1917 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 1918 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 1919 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 1920 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 1921 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 1922 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 1923 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 1924 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 1925 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 1926 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 1927 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 1928 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 1929 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 1930 + "-----END RSA PRIVATE KEY-----\n"; 1931 let publicPkcs1Str1024: string = 1932 "-----BEGIN RSA PUBLIC KEY-----\n" 1933 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 1934 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 1935 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 1936 + "-----END RSA PUBLIC KEY-----\n"; 1937async function TestConvertPemKeyByPromise() { 1938 let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 1939 let keyGenPromise = asyKeyGenerator.convertPemKey(publicPkcs1Str1024, priKeyPkcs1Str1024); 1940 keyGenPromise.then(keyPair => { 1941 console.info('convertPemKey success.'); 1942 }).catch((error: BusinessError) => { 1943 console.error("convertPemKey error."); 1944 }); 1945} 1946``` 1947 1948### convertPemKeySync<sup>12+</sup> 1949 1950convertPemKeySync(pubKey: string | null, priKey: string | null): KeyPair 1951 1952同步获取指定数据生成非对称密钥。 1953 1954> **说明:** 1955> convertPemKeySync接口与convertPemKey接口注意事项相同,见[convertPemKey](#convertpemkey12)接口说明。 1956 1957**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1958 1959**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1960 1961**参数:** 1962 1963| 参数名 | 类型 | 必填 | 说明 | 1964| ------ | -------- | ---- | ---------------- | 1965| pubKey | string \| null| 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。| 1966| priKey | string \| null| 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。| 1967 1968**返回值:** 1969 1970| 类型 | 说明 | 1971| ----------------- | --------------------------------- | 1972| [KeyPair](#keypair) | 非对称密钥。 | 1973 1974**错误码:** 1975以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1976 1977| 错误码ID | 错误信息 | 1978| -------- | ---------------------- | 1979| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1980| 17620001 | memory error. | 1981| 17630001 | crypto operation error. | 1982 1983**示例:** 1984 1985```ts 1986import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1987import { BusinessError } from '@kit.BasicServicesKit'; 1988 1989let priKeyPkcs1Str1024: string = 1990 "-----BEGIN RSA PRIVATE KEY-----\n" 1991 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 1992 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 1993 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 1994 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 1995 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 1996 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 1997 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 1998 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 1999 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 2000 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 2001 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 2002 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 2003 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 2004 + "-----END RSA PRIVATE KEY-----\n"; 2005 let publicPkcs1Str1024: string = 2006 "-----BEGIN RSA PUBLIC KEY-----\n" 2007 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 2008 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 2009 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 2010 + "-----END RSA PUBLIC KEY-----\n"; 2011function TestConvertPemKeyBySync() { 2012 let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 2013 try { 2014 let keyPairData = asyKeyGenerator.convertPemKeySync(publicPkcs1Str1024, priKeyPkcs1Str1024); 2015 if (keyPairData != null) { 2016 console.info('[Sync]: convert pem key pair success'); 2017 } else { 2018 console.error("[Sync]: convert pem key pair result fail!"); 2019 } 2020 } catch (e) { 2021 console.error(`Sync error, ${e.code}, ${e.message}`); 2022 } 2023} 2024``` 2025 2026## cryptoFramework.createAsyKeyGeneratorBySpec<sup>10+</sup> 2027 2028createAsyKeyGeneratorBySpec(asyKeySpec: AsyKeySpec): AsyKeyGeneratorBySpec 2029 2030通过指定密钥参数,获取相应的非对称密钥生成器实例。 2031 2032支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。 2033 2034**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2035 2036**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2037 2038API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2039 2040**参数:** 2041 2042| 参数名 | 类型 | 必填 | 说明 | 2043| ------- | ------ | ---- | -------------------------------- | 2044| asyKeySpec | [AsyKeySpec](#asykeyspec10) | 是 | 密钥参数。非对称密钥生成器根据指定的这些参数生成公/私钥。 | 2045 2046**返回值:** 2047 2048| 类型 | 说明 | 2049| ----------------------------------------------- | -------------------------- | 2050| [AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10) | 返回非对称密钥生成器实例。 | 2051 2052**错误码:** 2053以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2054 2055| 错误码ID | 错误信息 | 2056| -------- | ---------------------- | 2057| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2058| 801 | this operation is not supported. | 2059| 17620001 | memory error. | 2060 2061**示例:** 2062 2063```ts 2064import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2065 2066// 配置DSA1024公钥和私钥中包含的公共参数 2067function genDsa1024CommonSpecBigE() { 2068 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2069 algName: "DSA", 2070 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2071 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2072 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2073 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2074 } 2075 return dsaCommonSpec; 2076} 2077 2078// 设置DSA1024密钥对中包含的全参数 2079function genDsa1024KeyPairSpecBigE() { 2080 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2081 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2082 algName: "DSA", 2083 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2084 params: dsaCommonSpec, 2085 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2086 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2087 } 2088 return dsaKeyPairSpec; 2089} 2090 2091let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2092let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2093``` 2094 2095## AsyKeyGeneratorBySpec<sup>10+</sup> 2096 2097非对称密钥生成器。在使用该类的方法前,需要先使用[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法构建一个AsyKeyGeneratorBySpec实例。 2098 2099### 属性 2100 2101**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2102 2103**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2104 2105API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2106 2107| 名称 | 类型 | 可读 | 可写 | 说明 | 2108| ------- | ------ | ---- | ---- | -------------------------- | 2109| algName | string | 是 | 否 | 非对称密钥生成器的算法名。 | 2110 2111### generateKeyPair 2112 2113generateKeyPair(callback: AsyncCallback\<KeyPair>): void 2114 2115异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2116 2117当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2118 2119**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2120 2121**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2122 2123API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2124 2125**参数:** 2126 2127| 参数名 | 类型 | 必填 | 说明 | 2128| -------- | ----------------------- | ---- | ------------------------------ | 2129| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 2130 2131**错误码:** 2132以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2133 2134| 错误码ID | 错误信息 | 2135| -------- | ----------------------- | 2136| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types; | 2137| 17620001 | memory error. | 2138| 17630001 | crypto operation error. | 2139 2140**示例:** 2141 2142<!--code_no_check--> 2143```ts 2144let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2145let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2146asyKeyGeneratorBySpec.generateKeyPair((err, keyPair) => { 2147 if (err) { 2148 console.error("generateKeyPair: error."); 2149 return; 2150 } 2151 console.info('generateKeyPair: success.'); 2152}) 2153``` 2154 2155### generateKeyPair 2156 2157generateKeyPair(): Promise\<KeyPair> 2158 2159异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 2160 2161当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2162 2163**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2164 2165**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2166 2167API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2168 2169**返回值:** 2170 2171| 类型 | 说明 | 2172| ----------------- | --------------------------------- | 2173| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 2174 2175**错误码:** 2176以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2177 2178| 错误码ID | 错误信息 | 2179| -------- | ---------------------- | 2180| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2181| 17620001 | memory error. | 2182| 17630001 | crypto operation error. | 2183 2184**示例:** 2185 2186<!--code_no_check--> 2187```ts 2188import { BusinessError } from '@kit.BasicServicesKit'; 2189 2190let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2191let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2192let keyGenPromise = asyKeyGeneratorBySpec.generateKeyPair(); 2193keyGenPromise.then(keyPair => { 2194 console.info('generateKeyPair success.'); 2195}).catch((error: BusinessError) => { 2196 console.error("generateKeyPair error."); 2197}); 2198``` 2199 2200### generateKeyPairSync<sup>12+</sup> 2201 2202generateKeyPairSync(): KeyPair 2203 2204同步获取该非对称密钥生成器生成的密钥。 2205 2206当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2207 2208**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2209 2210**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2211 2212**返回值:** 2213 2214| 类型 | 说明 | 2215| ----------------- | --------------------------------- | 2216| [KeyPair](#keypair) | 非对称密钥。 | 2217 2218**错误码:** 2219以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2220 2221| 错误码ID | 错误信息 | 2222| -------- | ---------------------- | 2223| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2224| 17620001 | memory error. | 2225| 17630001 | crypto operation error. | 2226 2227**示例:** 2228 2229<!--code_no_check--> 2230```ts 2231import { BusinessError } from '@kit.BasicServicesKit'; 2232 2233let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2234let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2235try { 2236 let keyPairData = asyKeyGeneratorBySpec.generateKeyPairSync(); 2237 if (keyPairData != null) { 2238 console.info('[Sync]: key pair success'); 2239 } else { 2240 console.error("[Sync]: get key pair result fail!"); 2241 } 2242} catch (error) { 2243 let e: BusinessError = error as BusinessError; 2244 console.error(`sync error, ${e.code}, ${e.message}`); 2245} 2246``` 2247 2248### generatePriKey 2249 2250generatePriKey(callback: AsyncCallback\<PriKey>): void 2251 2252异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2253 2254当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。 2255 2256**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2257 2258**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2259 2260API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2261 2262**参数:** 2263 2264| 参数名 | 类型 | 必填 | 说明 | 2265| -------- | ----------------------- | ---- | ------------------------------ | 2266| callback | AsyncCallback\<[PriKey](#prikey)> | 是 | 回调函数,用于获取非对称密钥。 | 2267 2268**错误码:** 2269以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2270 2271| 错误码ID | 错误信息 | 2272| -------- | ---------------------- | 2273| 401 | invalid parameters. Possible causes: <br>Mandatory parameters are left unspecified; | 2274| 17620001 | memory error. | 2275| 17630001 | crypto operation error. | 2276 2277**示例:** 2278 2279<!--code_no_check--> 2280```ts 2281let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2282let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2283asyKeyGeneratorBySpec.generatePriKey((err, prikey) => { 2284 if (err) { 2285 console.error("generatePriKey: error."); 2286 return; 2287 } 2288 console.info('generatePriKey: success.'); 2289}) 2290``` 2291 2292### generatePriKey 2293 2294generatePriKey(): Promise\<PriKey> 2295 2296异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 2297 2298当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。 2299 2300**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2301 2302**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2303 2304API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2305 2306**返回值:** 2307 2308| 类型 | 说明 | 2309| ----------------- | --------------------------------- | 2310| Promise\<[PriKey](#prikey)> | 使用Promise的方式获取非对称密钥。 | 2311 2312**错误码:** 2313以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2314 2315| 错误码ID | 错误信息 | 2316| -------- | ---------------------- | 2317| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2318| 17620001 | memory error. | 2319| 17630001 | crypto operation error. | 2320 2321**示例:** 2322 2323<!--code_no_check--> 2324```ts 2325import { BusinessError } from '@kit.BasicServicesKit'; 2326 2327let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2328let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2329let keyGenPromise = asyKeyGeneratorBySpec.generatePriKey(); 2330keyGenPromise.then(priKey => { 2331 console.info('generatePriKey success.'); 2332}).catch((error: BusinessError) => { 2333 console.error("generatePriKey error."); 2334}); 2335``` 2336 2337### generatePriKeySync<sup>12+</sup> 2338 2339generatePriKeySync(): PriKey 2340 2341同步获取该非对称密钥生成器生成的密钥。 2342 2343当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。 2344 2345**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2346 2347**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2348 2349**返回值:** 2350 2351| 类型 | 说明 | 2352| ----------------- | --------------------------------- | 2353| [PriKey](#prikey) | 非对称密钥。 | 2354 2355**错误码:** 2356以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2357 2358| 错误码ID | 错误信息 | 2359| -------- | ---------------------- | 2360| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2361| 17620001 | memory error. | 2362| 17630001 | crypto operation error. | 2363 2364**示例:** 2365 2366<!--code_no_check--> 2367```ts 2368let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2369let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2370try { 2371 let priKeyData = asyKeyGeneratorBySpec.generatePriKeySync(); 2372 if (priKeyData != null) { 2373 console.info('[Sync]: pri key success'); 2374 } else { 2375 console.error("[Sync]: get pri key result fail!"); 2376 } 2377} catch (e) { 2378 console.error(`sync error, ${e.code}, ${e.message}`); 2379} 2380``` 2381 2382### generatePubKey 2383 2384generatePubKey(callback: AsyncCallback\<PubKey>): void 2385 2386异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2387 2388当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。 2389 2390**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2391 2392**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2393 2394API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2395 2396**参数:** 2397 2398| 参数名 | 类型 | 必填 | 说明 | 2399| -------- | ----------------------- | ---- | ------------------------------ | 2400| callback | AsyncCallback\<[PubKey](#pubkey)> | 是 | 回调函数,用于获取非对称密钥。 | 2401 2402**错误码:** 2403以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2404 2405| 错误码ID | 错误信息 | 2406| -------- | ---------------------- | 2407| 401 | invalid parameters. Possible causes:<br> Incorrect parameter types; | 2408| 17620001 | memory error. | 2409| 17630001 | crypto operation error. | 2410 2411**示例:** 2412 2413<!--code_no_check--> 2414```ts 2415let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2416let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2417asyKeyGeneratorBySpec.generatePubKey((err, pubKey) => { 2418 if (err) { 2419 console.error("generatePubKey: error."); 2420 return; 2421 } 2422 console.info('generatePubKey: success.'); 2423}) 2424``` 2425 2426### generatePubKey 2427 2428generatePubKey(): Promise\<PubKey> 2429 2430异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 2431 2432当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。 2433 2434**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2435 2436**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2437 2438API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2439 2440**返回值:** 2441 2442| 类型 | 说明 | 2443| ----------------- | --------------------------------- | 2444| Promise\<[PubKey](#pubkey)> | 使用Promise的方式获取非对称密钥。 | 2445 2446**错误码:** 2447以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2448 2449| 错误码ID | 错误信息 | 2450| -------- | ---------------------- | 2451| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2452| 17620001 | memory error. | 2453| 17630001 | crypto operation error. | 2454 2455**示例:** 2456 2457<!--code_no_check--> 2458```ts 2459import { BusinessError } from '@kit.BasicServicesKit'; 2460 2461let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2462let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2463let keyGenPromise = asyKeyGeneratorBySpec.generatePubKey(); 2464keyGenPromise.then(pubKey => { 2465 console.info('generatePubKey success.'); 2466}).catch((error: BusinessError) => { 2467 console.error("generatePubKey error."); 2468}); 2469``` 2470 2471### generatePubKeySync<sup>12+</sup> 2472 2473generatePubKeySync(): PubKey 2474 2475同步获取该非对称密钥生成器生成的密钥。 2476 2477当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。 2478 2479**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2480 2481**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2482 2483**返回值:** 2484 2485| 类型 | 说明 | 2486| ----------------- | --------------------------------- | 2487| [PubKey](#pubkey) | 非对称密钥。 | 2488 2489**错误码:** 2490以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2491 2492| 错误码ID | 错误信息 | 2493| -------- | ---------------------- | 2494| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2495| 17620001 | memory error. | 2496| 17630001 | crypto operation error. | 2497 2498**示例:** 2499 2500<!--code_no_check--> 2501```ts 2502let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2503let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2504try { 2505 let pubKeyData = asyKeyGeneratorBySpec.generatePubKeySync(); 2506 if (pubKeyData != null) { 2507 console.info('[Sync]: pub key success'); 2508 } else { 2509 console.error("[Sync]: get pub key result fail!"); 2510 } 2511} catch (e) { 2512 console.error(`sync error, ${e.code}, ${e.message}`); 2513} 2514``` 2515 2516## ECCKeyUtil<sup>11+</sup> 2517 2518根据椭圆曲线名生成相应的非对称公共密钥参数。 2519 2520### genECCCommonParamsSpec<sup>11+</sup> 2521 2522static genECCCommonParamsSpec(curveName: string): ECCCommonParamsSpec 2523 2524根据椭圆曲线相应的NID(Name IDentifier)字符串名称生成相应的非对称公共密钥参数。详见[ECC密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#ecc)和[SM2密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#sm2)。 2525 2526**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2527 2528**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2529 2530API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2531 2532**参数:** 2533 2534| 参数名 | 类型 | 必填 | 说明 | 2535| ------- | ------ | ---- | ---------------------------------------------- | 2536| curveName | string | 是 | 椭圆曲线相应的NID(Name IDentifier)字符串名称。 | 2537 2538**返回值:** 2539 2540| 类型 | 说明 | 2541| ----------------- | --------------------------------- | 2542| [ECCCommonParamsSpec](#ecccommonparamsspec10) | 返回ECC公共密钥参数。 | 2543 2544**错误码:** 2545以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2546 2547| 错误码ID | 错误信息 | 2548| -------- | -------------------------------- | 2549| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2550| 801 | this operation is not supported. | 2551| 17620001 | memory error. | 2552 2553**示例:** 2554 2555```ts 2556import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2557import { BusinessError } from '@kit.BasicServicesKit'; 2558try { 2559 let ECCCommonParamsSpec = cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_brainpoolP160r1'); 2560 console.info('genECCCommonParamsSpec success'); 2561} catch (err) { 2562 let e: BusinessError = err as BusinessError; 2563 console.error(`genECCCommonParamsSpec error, ${e.code}, ${e.message}`); 2564} 2565``` 2566 2567### convertPoint<sup>12+</sup> 2568 2569static convertPoint(curveName: string, encodedPoint: Uint8Array): Point 2570 2571根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),将指定的点数据转换为Point对象。当前支持压缩/非压缩格式的点数据。 2572 2573> **说明:** 2574> 2575> 根据RFC5480规范中第2.2节的描述:<br/> 2576> 1. 非压缩的点数据,表示为:前缀0x04\|x坐标\|y坐标; 2577> 2. 压缩的点数据,对于Fp素数域上的点(当前暂不支持F2m域),表示为:前缀0x03\|x坐标 (坐标y是奇数时),前缀0x02\|x坐标 (坐标y是偶数时)。 2578 2579**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2580 2581**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2582 2583**参数:** 2584 2585| 参数名 | 类型 | 必填 | 说明 | 2586| ------------ | ---------- | ---- | ---------------------------------------------- | 2587| curveName | string | 是 | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 | 2588| encodedPoint | Uint8Array | 是 | 指定的ECC椭圆曲线上的点的数据。 | 2589 2590**返回值:** 2591 2592| 类型 | 说明 | 2593| ----------------- | ------------------- | 2594| [Point](#point10) | 返回ECC的Point对象。 | 2595 2596**错误码:** 2597以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2598 2599| 错误码ID | 错误信息 | 2600| -------- | ---------------------- | 2601| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2602| 17620001 | memory error. | 2603| 17630001 | crypto operation error. | 2604 2605**示例:** 2606 2607```ts 2608import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2609 2610// 随机生成的非压缩点数据 2611let pkData = new Uint8Array([4, 143, 39, 57, 249, 145, 50, 63, 222, 35, 70, 178, 121, 202, 154, 21, 146, 129, 75, 76, 63, 8, 195, 157, 111, 40, 217, 215, 148, 120, 224, 205, 82, 83, 92, 185, 21, 211, 184, 5, 19, 114, 33, 86, 85, 228, 123, 242, 206, 200, 98, 178, 184, 130, 35, 232, 45, 5, 202, 189, 11, 46, 163, 156, 152]); 2612let returnPoint = cryptoFramework.ECCKeyUtil.convertPoint('NID_brainpoolP256r1', pkData); 2613console.info('returnPoint: ' + returnPoint.x.toString(16)); 2614``` 2615 2616### getEncodedPoint<sup>12+</sup> 2617 2618static getEncodedPoint(curveName: string, point: Point, format: string): Uint8Array 2619 2620根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),按照指定的点数据格式,将Point对象转换为点数据。当前支持压缩/非压缩格式的点数据。 2621 2622**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2623 2624**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2625 2626**参数:** 2627 2628| 参数名 | 类型 | 必填 | 说明 | 2629| ------------ | ----------------- | ---- | ---------------------------------------------- | 2630| curveName | string | 是 | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 | 2631| point | [Point](#point10) | 是 | 椭圆曲线上的Point点对象。 | 2632| format | string | 是 | 需要获取的点数据格式,当前支持"COMPRESSED"或"UNCOMPRESSED"。 | 2633 2634**返回值:** 2635 2636| 类型 | 说明 | 2637| ----------------- | --------------------------------- | 2638| Uint8Array | 返回指定格式的点数据。 | 2639 2640**错误码:** 2641以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2642 2643| 错误码ID | 错误信息 | 2644| -------- | ---------------------- | 2645| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2646| 17620001 | memory error. | 2647| 17630001 | crypto operation error. | 2648 2649**示例:** 2650 2651```ts 2652import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2653 2654async function doTest() { 2655 let generator = cryptoFramework.createAsyKeyGenerator('ECC_BrainPoolP256r1'); 2656 let keyPair = await generator.generateKeyPair(); 2657 let eccPkX = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_X_BN); 2658 let eccPkY = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_Y_BN); 2659 console.info('ECC_PK_X_BN 16:' + eccPkX.toString(16)); 2660 console.info('ECC_PK_Y_BN 16:' + eccPkY.toString(16)); 2661 // 将eccPkX.toString(16)结果放入x,eccPkY.toString(16)结果放入y 2662 let returnPoint: cryptoFramework.Point = { 2663 x: BigInt('0x' + eccPkX.toString(16)), 2664 y: BigInt('0x' + eccPkY.toString(16)) 2665 }; 2666 let returnData = cryptoFramework.ECCKeyUtil.getEncodedPoint('NID_brainpoolP256r1', returnPoint, 'UNCOMPRESSED'); 2667 console.info('returnData: ' + returnData); 2668} 2669``` 2670 2671## DHKeyUtil<sup>11+</sup> 2672 2673根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。 2674 2675### genDHCommonParamsSpec<sup>11+</sup> 2676 2677static genDHCommonParamsSpec(pLen: number, skLen?: number): DHCommonParamsSpec 2678 2679根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。详见[DH密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#dh)。 2680 2681**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2682 2683**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2684 2685API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2686 2687**参数:** 2688 2689| 参数名 | 类型 | 必填 | 说明 | 2690| ------ | ------ | ---- | ------------------------------------------------ | 2691| pLen | number | 是 | 用于指定DH公共密钥参数中素数P的长度,单位为bit。 | 2692| skLen | number | 否 | 用于指定DH公共密钥参数中私钥的长度,单位为bit。 | 2693 2694**返回值:** 2695 2696| 类型 | 说明 | 2697| ----------------- | --------------------------------- | 2698| [DHCommonParamsSpec](#dhcommonparamsspec11) | 返回DH公共密钥参数。 | 2699 2700**错误码:** 2701以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2702 2703| 错误码ID | 错误信息 | 2704| -------- | -------------------------------- | 2705| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2706| 801 | this operation is not supported. | 2707| 17620001 | memory error. | 2708| 17630001 | crypto operation error. | 2709 2710**示例:** 2711 2712```ts 2713import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2714import { BusinessError } from '@kit.BasicServicesKit'; 2715try { 2716 let DHCommonParamsSpec = cryptoFramework.DHKeyUtil.genDHCommonParamsSpec(2048); 2717 console.info('genDHCommonParamsSpec success'); 2718} catch (err) { 2719 let e: BusinessError = err as BusinessError; 2720 console.error(`genDHCommonParamsSpec error, ${e.code}, ${e.message}`); 2721} 2722``` 2723 2724## SM2CryptoUtil<sup>12+</sup> 2725 2726用于SM2密码学运算的工具类。 2727 2728### genCipherTextBySpec<sup>12+</sup> 2729 2730static genCipherTextBySpec(spec: SM2CipherTextSpec, mode?: string): DataBlob 2731 2732根据指定的SM2密文参数,生成符合国密标准的ASN.1格式的SM2密文。 2733 2734**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2735 2736**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2737 2738**参数:** 2739 2740| 参数名 | 类型 | 必填 | 说明 | 2741| ------ | ------ | ---- | ------------------------------------------------ | 2742| spec | [SM2CipherTextSpec](#sm2ciphertextspec12) | 是 | 指定的SM2密文参数。 | 2743| mode | string | 否 | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。 | 2744 2745**返回值:** 2746 2747| 类型 | 说明 | 2748| ----------------- | --------------------------------- | 2749| [DataBlob](#datablob) | 返回符合国密标准的ASN.1格式的SM2密文。 | 2750 2751**错误码:** 2752以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2753 2754| 错误码ID | 错误信息 | 2755| -------- | -------------------------------- | 2756| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2757| 17620001 | memory error. | 2758| 17630001 | crypto operation error. | 2759 2760**示例:** 2761 2762```ts 2763import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2764import { BusinessError } from '@kit.BasicServicesKit'; 2765try { 2766 let spec : cryptoFramework.SM2CipherTextSpec = { 2767 xCoordinate: BigInt('20625015362595980457695435345498579729138244358573902431560627260141789922999'), 2768 yCoordinate: BigInt('48563164792857017065725892921053777369510340820930241057309844352421738767712'), 2769 cipherTextData: new Uint8Array([100,227,78,195,249,179,43,70,242,69,169,10,65,123]), 2770 hashData: new Uint8Array([87,167,167,247,88,146,203,234,83,126,117,129,52,142,82,54,152,226,201,111,143,115,169,125,128,42,157,31,114,198,109,244]), 2771 } 2772 let data = cryptoFramework.SM2CryptoUtil.genCipherTextBySpec(spec, 'C1C3C2'); 2773 console.info('genCipherTextBySpec success'); 2774} catch (err) { 2775 let e: BusinessError = err as BusinessError; 2776 console.error(`genCipherTextBySpec error, ${e.code}, ${e.message}`); 2777} 2778``` 2779 2780### getCipherTextSpec<sup>12+</sup> 2781 2782static getCipherTextSpec(cipherText: DataBlob, mode?: string): SM2CipherTextSpec 2783 2784从符合国密标准的ASN.1格式的SM2密文中,获取具体的SM2密文参数。 2785 2786**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2787 2788**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2789 2790**参数:** 2791 2792| 参数名 | 类型 | 必填 | 说明 | 2793| ------ | ------ | ---- | ------------------------------------------------ | 2794| cipherText | [DataBlob](#datablob) | 是 | 符合国密标准的ASN.1格式的SM2密文。 2795| mode | string | 否 | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。 | 2796 2797**返回值:** 2798 2799| 类型 | 说明 | 2800| ----------------- | --------------------------------- | 2801| [SM2CipherTextSpec](#sm2ciphertextspec12) | 返回具体的SM2密文参数。 | 2802 2803**错误码:** 2804以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2805 2806| 错误码ID | 错误信息 | 2807| -------- | -------------------------------- | 2808| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2809| 17620001 | memory error. | 2810| 17630001 | crypto operation error. | 2811 2812```ts 2813import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2814import { BusinessError } from '@kit.BasicServicesKit'; 2815try { 2816 let cipherTextArray = new Uint8Array([48,118,2,32,45,153,88,82,104,221,226,43,174,21,122,248,5,232,105,41,92,95,102,224,216,149,85,236,110,6,64,188,149,70,70,183,2,32,107,93,198,247,119,18,40,110,90,156,193,158,205,113,170,128,146,109,75,17,181,109,110,91,149,5,110,233,209,78,229,96,4,32,87,167,167,247,88,146,203,234,83,126,117,129,52,142,82,54,152,226,201,111,143,115,169,125,128,42,157,31,114,198,109,244,4,14,100,227,78,195,249,179,43,70,242,69,169,10,65,123]); 2817 let cipherText : cryptoFramework.DataBlob = {data : cipherTextArray}; 2818 let spec : cryptoFramework.SM2CipherTextSpec = cryptoFramework.SM2CryptoUtil.getCipherTextSpec(cipherText, 'C1C3C2'); 2819 console.info('getCipherTextSpec success'); 2820} catch (err) { 2821 let e: BusinessError = err as BusinessError; 2822 console.error(`getCipherTextSpec error, ${e.code}, ${e.message}`); 2823} 2824``` 2825 2826## cryptoFramework.createCipher 2827 2828createCipher(transformation: string): Cipher 2829 2830通过指定算法名称,获取相应的[Cipher](#cipher)实例。 2831 2832支持的规格详见[对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-sym-encrypt-decrypt-spec.md)和[非对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md)。 2833 2834**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2835 2836**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2837 2838API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 2839 2840**参数:** 2841 2842| 参数名 | 类型 | 必填 | 说明 | 2843| -------------- | ------ | ---- | ------------------------------------------------------------ | 2844| transformation | string | 是 | 待生成Cipher的算法名称(含密钥长度)、加密模式以及填充方法的组合。 | 2845 2846> **说明:** 2847> 2848> 1. 目前对称加解密中,PKCS5和PKCS7的实现相同,其padding长度和分组长度保持一致(即PKCS5和PKCS7在3DES中均按照8字节填充,在AES中均按照16字节填充),另有NoPadding表示不填充。 2849> <br/>开发者需要自行了解密码学不同分组模式的差异,以便选择合适的参数规格。例如选择ECB和CBC模式时,建议启用填充,否则必须确保明文长度是分组大小的整数倍;选择其他模式时,可以不启用填充,此时密文长度和明文长度一致(即可能不是分组大小的整数倍)。 2850> 2. 使用RSA、SM2进行非对称加解密时,必须创建两个Cipher对象分别进行加密和解密操作,而不能对同一个Cipher对象进行加解密。对称加解密没有此要求(即只要算法规格一样,可以对同一个Cipher对象进行加解密操作)。 2851 2852**返回值:** 2853 2854| 类型 | 说明 | 2855| ----------------- | ------------------------ | 2856| [Cipher](#cipher) | 返回加解密生成器的对象。 | 2857 2858**错误码:** 2859以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2860 2861| 错误码ID | 错误信息 | 2862| -------- | ---------------------- | 2863| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2864| 801 | this operation is not supported. | 2865| 17620001 | memory error. | 2866 2867**示例:** 2868 2869```ts 2870import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2871import { BusinessError } from '@kit.BasicServicesKit'; 2872 2873let cipherAlgName = '3DES192|ECB|PKCS7'; 2874try { 2875 let cipher = cryptoFramework.createCipher(cipherAlgName); 2876 console.info('cipher algName:' + cipher.algName); 2877} catch (error) { 2878 let e: BusinessError = error as BusinessError; 2879 console.error(`sync error, ${e.code}, ${e.message}`); 2880} 2881``` 2882 2883## Cipher 2884 2885提供加解密的算法操作功能,按序调用本类中的[init()](#init-1)、[update()](#update)、[doFinal()](#dofinal)方法,可以实现对称加密/对称解密/非对称加密/非对称解密。 2886 2887完整的加解密流程示例可参考开发指导中的[加解密开发指导](../../security/CryptoArchitectureKit/crypto-encryption-decryption-overview.md)。 2888 2889一次完整的加/解密流程在对称加密和非对称加密中略有不同: 2890 2891- 对称加解密:init为必选,update为可选(且允许多次update加/解密大数据),doFinal为必选;doFinal结束后可以重新init开始新一轮加/解密流程。 2892- RSA、SM2非对称加解密:init为必选,不支持update操作,doFinal为必选(允许连续多次doFinal加/解密大数据);RSA不支持重复init,切换加解密模式或填充方式时,需要重新创建Cipher对象。 2893 2894### 属性 2895 2896**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2897 2898**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2899 2900API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 2901 2902| 名称 | 类型 | 可读 | 可写 | 说明 | 2903| ------- | ------ | ---- | ---- | ---------------------------- | 2904| algName | string | 是 | 否 | 加解密生成器指定的算法名称。 | 2905 2906### init 2907 2908init(opMode: CryptoMode, key: Key, params: ParamsSpec | null, callback: AsyncCallback\<void>): void 2909 2910初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 2911 2912必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 2913 2914**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2915 2916**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2917 2918API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 2919 2920**参数:** 2921 2922| 参数名 | 类型 | 必填 | 说明 | 2923| -------- | ------------------------- | ---- | ------------------------------------------------------------ | 2924| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 2925| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 2926| params | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前只支持ParamsSpec, API 10之后增加支持null。 | 2927| callback | AsyncCallback\<void> | 是 | 回调函数。当加解密初始化成功,err为undefined,否则为错误对象。 | 2928 2929**错误码:** 2930以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2931 2932| 错误码ID | 错误信息 | 2933| -------- | --------------------------------------------------------- | 2934| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2935| 17620001 | memory error. | 2936| 17620002 | runtime error. | 2937| 17630001 | crypto operation error.| 2938 2939### init 2940 2941init(opMode: CryptoMode, key: Key, params: ParamsSpec | null): Promise\<void> 2942 2943初始化加解密的cipher对象,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 2944 2945必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 2946 2947**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2948 2949**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2950 2951API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 2952 2953**参数:** 2954 2955| 参数名 | 类型 | 必填 | 说明 | 2956| ------ | ------------------------- | ---- | ------------------------------------------------------------ | 2957| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 2958| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 2959| params | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前只支持ParamsSpec, API 10之后增加支持null。 | 2960 2961**返回值:** 2962 2963| 类型 | 说明 | 2964| -------------- | -------------------------------------- | 2965| Promise\<void> | 无返回结果的Promise对象。 | 2966 2967**错误码:** 2968以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2969 2970| 错误码ID | 错误信息 | 2971| -------- | ------------------------------------------------- | 2972| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2973| 17620001 | memory error. | 2974| 17620002 | runtime error. | 2975| 17630001 | crypto operation error.| 2976 2977### initSync<sup>12+</sup> 2978 2979initSync(opMode: CryptoMode, key: Key, params: ParamsSpec | null): void 2980 2981初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。 2982 2983必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 2984 2985**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2986 2987**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2988 2989**参数:** 2990 2991| 参数名 | 类型 | 必填 | 说明 | 2992| ------ | ----------------------------------------------- | ---- | ------------------------------------------------------------ | 2993| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 2994| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 2995| params | [ParamsSpec](#paramsspec) | 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 | 2996 2997**错误码:** 2998以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2999 3000| 错误码ID | 错误信息 | 3001| -------- | ----------------------- | 3002| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3003| 17620001 | memory error. | 3004| 17620002 | runtime error. | 3005| 17630001 | crypto operation error. | 3006 3007### update 3008 3009update(data: DataBlob, callback: AsyncCallback\<DataBlob>): void 3010 3011分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。 3012 3013必须在对[Cipher](#cipher)实例使用[init()](#init-1)初始化后,才能使用本函数。 3014 3015> **说明:** 3016> 3017> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和doFinal结果产生影响。<br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。) 3018> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。<br/> 3019> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,采用多次update的方式传入数据。<br/> 3020> AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。 3021> 3. RSA、SM2非对称加解密不支持update操作。 3022> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。 3023 3024**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3025 3026**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3027 3028API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3029 3030**参数:** 3031 3032| 参数名 | 类型 | 必填 | 说明 | 3033| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ | 3034| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。data不能为null。 | 3035| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数。当更新加/解密数据成功,err为undefined,data为此次更新的加/解密结果DataBlob;否则为错误对象。 | 3036 3037**错误码:** 3038以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3039 3040| 错误码ID | 错误信息 | 3041| -------- | ------------------------------------------- | 3042| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3043| 17620001 | memory error. | 3044| 17620002 | runtime error. | 3045| 17630001 | crypto operation error. | 3046 3047### update 3048 3049update(data: DataBlob): Promise\<DataBlob> 3050 3051分段更新加密或者解密数据操作,通过Promise获取加/解密数据。 3052 3053必须在对[Cipher](#cipher)实例使用[init()](#init-2)初始化后,才能使用本函数。 3054 3055> **说明:** 3056> 3057> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和doFinal结果产生影响。 3058> <br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。) 3059> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。<br/> 3060> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,可以采用多次update的方式传入数据。<br/> 3061> AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。 3062> 3. RSA、SM2非对称加解密不支持update操作。 3063> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。 3064 3065**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3066 3067**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3068 3069API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3070 3071**参数:** 3072 3073| 参数名 | 类型 | 必填 | 说明 | 3074| ---- | --------------------- | ---- | -------------------- | 3075| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。data不能为null。 | 3076 3077**返回值:** 3078 3079| 类型 | 说明 | 3080| ------------------------------- | ------------------------------------------------ | 3081| Promise\<[DataBlob](#datablob)> | Promise对象,返回此次更新的加/解密结果DataBlob。 | 3082 3083**错误码:** 3084以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3085 3086| 错误码ID | 错误信息 | 3087| -------- | -------------------------------------------- | 3088| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3089| 17620001 | memory error. | 3090| 17620002 | runtime error. | 3091| 17630001 | crypto operation error. | 3092 3093### updateSync<sup>12+</sup> 3094 3095updateSync(data: DataBlob): DataBlob 3096 3097分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。 3098 3099必须在对[Cipher](#cipher)实例使用[initSync()](#initsync12)初始化后,才能使用本函数。 3100 3101其他注意事项同上异步接口说明。 3102 3103**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3104 3105**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3106 3107**参数:** 3108 3109| 参数名 | 类型 | 必填 | 说明 | 3110| ------ | --------------------- | ---- | ------------------------------------------------------------ | 3111| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。data不能为null。 | 3112 3113**错误码:** 3114以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3115 3116| 错误码ID | 错误信息 | 3117| -------- | ----------------------- | 3118| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3119| 17620001 | memory error. | 3120| 17620002 | runtime error. | 3121| 17630001 | crypto operation error. | 3122 3123### doFinal 3124 3125doFinal(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void 3126 3127(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过注册回调函数获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用[update](#update-4)传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别: 3128 3129- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。 3130- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。 3131 3132(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。 3133 3134> **说明:** 3135> 3136> 1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用init()并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。 3137> 2. 如果遇到解密失败,需检查加解密数据和init时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。 3138> 3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。 3139> 4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。 3140 3141**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3142 3143**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3144 3145API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3146 3147**参数:** 3148 3149| 参数名 | 类型 | 必填 | 说明 | 3150| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ | 3151| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。API 10之前只支持DataBlob, API 10之后增加支持null。 | 3152| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数。当最终加/解密数据成功,err为undefined,data为剩余数据的加/解密结果DataBlob;否则为错误对象。 | 3153 3154**错误码:** 3155以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3156 3157| 错误码ID | 错误信息 | 3158| -------- | ----------------------- | 3159| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3160| 17620001 | memory error. | 3161| 17620002 | runtime error. | 3162| 17630001 | crypto operation error. | 3163 3164**以AES GCM模式加密为例:** 3165 3166此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 3167 3168```ts 3169import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3170import { buffer } from '@kit.ArkTS'; 3171 3172function generateRandom(len: number) { 3173 let rand = cryptoFramework.createRandom(); 3174 let generateRandSync = rand.generateRandomSync(len); 3175 return generateRandSync; 3176} 3177 3178function genGcmParamsSpec() { 3179 let ivBlob = generateRandom(12); 3180 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 3181 let dataAad = new Uint8Array(arr); 3182 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 3183 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 3184 let dataTag = new Uint8Array(arr); 3185 let tagBlob: cryptoFramework.DataBlob = { 3186 data: dataTag 3187 }; 3188 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 3189 iv: ivBlob, 3190 aad: aadBlob, 3191 authTag: tagBlob, 3192 algName: "GcmParamsSpec" 3193 }; 3194 return gcmParamsSpec; 3195} 3196 3197function cipherByCallback() { 3198 let gcmParams = genGcmParamsSpec(); 3199 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 3200 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 3201 symKeyGenerator.generateSymKey((err, symKey) => { 3202 cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams, (err,) => { 3203 let message = "This is a test"; 3204 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 3205 cipher.update(plainText, (err, encryptUpdate) => { 3206 cipher.doFinal(null, (err, tag) => { 3207 gcmParams.authTag = tag; 3208 console.info('encryptUpdate plainText:' + encryptUpdate.data); 3209 }); 3210 }); 3211 }); 3212 }); 3213} 3214``` 3215 3216### doFinal 3217 3218doFinal(data: DataBlob | null): Promise\<DataBlob> 3219 3220(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过Promise获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用update传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别: 3221 3222- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。 3223- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。 3224 3225(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过Promise获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。 3226 3227> **说明:** 3228> 3229> 1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用init()并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。 3230> 2. 如果遇到解密失败,需检查加解密数据和init时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。 3231> 3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。 3232> 4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。 3233 3234**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3235 3236**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3237 3238API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3239 3240**参数:** 3241 3242| 参数名 | 类型 | 必填 | 说明 | 3243| ---- | --------------------- | ---- | -------------------- | 3244| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 加密或者解密的数据。data参数允许为null,但不允许传入{data: Uint8Array(空) }。API 10之前只支持DataBlob, API 10之后增加支持null。 | 3245 3246**返回值:** 3247 3248| 类型 | 说明 | 3249| ------------------------------- | ------------------------------------------------ | 3250| Promise\<[DataBlob](#datablob)> | Promise对象,返回剩余数据的加/解密结果DataBlob。 | 3251 3252**错误码:** 3253以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3254 3255| 错误码ID | 错误信息 | 3256| -------- | -------------------------------------------- | 3257| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3258| 17620001 | memory error. | 3259| 17620002 | runtime error. | 3260| 17630001 | crypto operation error. | 3261 3262**以AES GCM模式加密为例:** 3263 3264此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 3265 3266```ts 3267import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3268import { buffer } from '@kit.ArkTS'; 3269 3270function generateRandom(len: number) { 3271 let rand = cryptoFramework.createRandom(); 3272 let generateRandSync = rand.generateRandomSync(len); 3273 return generateRandSync; 3274} 3275 3276function genGcmParamsSpec() { 3277 let ivBlob = generateRandom(12); 3278 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 3279 let dataAad = new Uint8Array(arr); 3280 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 3281 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 3282 let dataTag = new Uint8Array(arr); 3283 let tagBlob: cryptoFramework.DataBlob = { 3284 data: dataTag 3285 }; 3286 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 3287 iv: ivBlob, 3288 aad: aadBlob, 3289 authTag: tagBlob, 3290 algName: "GcmParamsSpec" 3291 }; 3292 return gcmParamsSpec; 3293} 3294 3295async function cipherByPromise() { 3296 let gcmParams = genGcmParamsSpec(); 3297 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 3298 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 3299 let symKey = await symKeyGenerator.generateSymKey(); 3300 await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams); 3301 let message = "This is a test"; 3302 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 3303 let encryptUpdate = await cipher.update(plainText); 3304 gcmParams.authTag = await cipher.doFinal(null); 3305 console.info('encryptUpdate plainText: ' + encryptUpdate.data); 3306} 3307``` 3308 3309### doFinalSync<sup>12+</sup> 3310 3311doFinalSync(data: DataBlob | null): DataBlob 3312 3313(1)在对称加解密中,doFinalSync加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过注册回调函数获取加密或者解密数据。<br/>如果数据量较小,可以在doFinalSync中一次性传入数据,而不使用updateSync;如果在本次加解密流程中,已经使用[updateSync](#updatesync12)传入过数据,可以在doFinalSync的data参数处传入null。<br/>根据对称加解密的模式不同,doFinalSync的输出有如下区别: 3314 3315- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次updateSync和doFinalSync的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinalSync的data参数传入null,则doFinalSync的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。 3316- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次updateSync和doFinalSync的结果拼接起来,得到完整的明文/密文。 3317 3318(2)在RSA、SM2非对称加解密中,doFinalSync加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinalSync,拼接结果得到完整的明文/密文。 3319 3320其他注意事项同接口[doFinal()](#dofinal)说明。 3321 3322**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3323 3324**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3325 3326**参数:** 3327 3328| 参数名 | 类型 | 必填 | 说明 | 3329| ------ | ------------------------------------------- | ---- | ------------------------------------------------------------ | 3330| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。 | 3331 3332**错误码:** 3333以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3334 3335| 错误码ID | 错误信息 | 3336| -------- | ----------------------- | 3337| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3338| 17620001 | memory error. | 3339| 17620002 | runtime error. | 3340| 17630001 | crypto operation error. | 3341 3342**以AES GCM模式加密为例:** 3343 3344此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 3345 3346```ts 3347import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3348import { buffer } from '@kit.ArkTS'; 3349 3350function generateRandom(len: number) { 3351 let rand = cryptoFramework.createRandom(); 3352 let generateRandSync = rand.generateRandomSync(len); 3353 return generateRandSync; 3354} 3355 3356function genGcmParamsSpec() { 3357 let ivBlob = generateRandom(12); 3358 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 3359 let dataAad = new Uint8Array(arr); 3360 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 3361 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 3362 let dataTag = new Uint8Array(arr); 3363 let tagBlob: cryptoFramework.DataBlob = { 3364 data: dataTag 3365 }; 3366 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 3367 iv: ivBlob, 3368 aad: aadBlob, 3369 authTag: tagBlob, 3370 algName: "GcmParamsSpec" 3371 }; 3372 return gcmParamsSpec; 3373} 3374 3375async function cipherBySync() { 3376 let gcmParams = genGcmParamsSpec(); 3377 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 3378 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 3379 let symKey = await symKeyGenerator.generateSymKey(); 3380 await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams); 3381 let message = "This is a test"; 3382 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 3383 let encryptUpdate = cipher.updateSync(plainText); 3384 gcmParams.authTag = cipher.doFinalSync(null); 3385 console.info('encryptUpdate plainText: ' + encryptUpdate.data); 3386} 3387 3388``` 3389 3390### setCipherSpec<sup>10+</sup> 3391 3392setCipherSpec(itemType: CipherSpecItem, itemValue: Uint8Array): void 3393 3394设置加解密参数。常用的加解密参数可以直接通过[createCipher](#cryptoframeworkcreatecipher) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。 3395 3396**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3397 3398**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3399 3400API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3401 3402**参数:** 3403 3404| 参数名 | 类型 | 必填 | 说明 | 3405| -------- | -------------------- | ---- | ---------- | 3406| itemType | [CipherSpecItem](#cipherspecitem10) | 是 | 用于指定需要设置的加解密参数。 | 3407| itemValue | Uint8Array | 是 | 用于指定加解密参数的具体值。 | 3408 3409**错误码:** 3410以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3411 3412| 错误码ID | 错误信息 | 3413| -------- | ---------------------- | 3414| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3415| 801 | this operation is not supported. | 3416| 17620001 | memory error. | 3417| 17630001 | crypto operation error. | 3418 3419**示例:** 3420 3421<!--code_no_check--> 3422```ts 3423let cipher: cryptoFramework.Cipher; // The process of generating the Cipher instance is omitted here. 3424let pSource = new Uint8Array([1,2,3,4]); 3425cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource); 3426``` 3427 3428### getCipherSpec<sup>10+</sup> 3429 3430getCipherSpec(itemType: CipherSpecItem): string | Uint8Array 3431 3432获取加解密参数。当前只支持RSA算法和SM2算法,从API version 11开始,支持SM2算法获取加解密参数。 3433 3434**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3435 3436**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3437 3438API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3439 3440**参数:** 3441 3442| 参数名 | 类型 | 必填 | 说明 | 3443| ------ | -------- | ---- | ---------- | 3444| itemType | [CipherSpecItem](#cipherspecitem10) | 是 | 用于指定需要获取的加解密参数。 | 3445 3446**返回值:** 3447 3448| 类型 | 说明 | 3449| -------------- | ----------- | 3450| string \| Uint8Array | 获取的加解密参数的具体值。 | 3451 3452**错误码:** 3453以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3454 3455| 错误码ID | 错误信息 | 3456| -------- | ---------------------- | 3457| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3458| 801 | this operation is not supported. | 3459| 17620001 | memory error. | 3460| 17630001 | crypto operation error. | 3461 3462**示例:** 3463 3464<!--code_no_check--> 3465```ts 3466let cipher: cryptoFramework.Cipher; // The process of generating the Cipher instance is omitted here. 3467let mdName = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR); 3468``` 3469 3470## cryptoFramework.createSign 3471 3472createSign(algName: string): Sign 3473 3474Sign实例生成。 3475 3476支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。 3477 3478**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3479 3480**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3481 3482API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3483 3484**参数:** 3485 3486| 参数名 | 类型 | 必填 | 说明 | 3487| ------- | ------ | ---- | ------------------------------------------------------------ | 3488| algName | string | 是 | 指定签名算法:RSA,ECC,DSA,SM2<sup>10+</sup>或ED25519<sup>11+</sup>。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。<br/>使用RSA算法签名时,通过设置OnlySign参数可支持传入数据摘要仅作签名。 | 3489 3490**返回值**: 3491 3492| 类型 | 说明 | 3493| ---- | ---------------------------------- | 3494| Sign | 返回由输入算法指定生成的Sign对象。 | 3495 3496**错误码:** 3497以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3498 3499| 错误码ID | 错误信息 | 3500| -------- | ---------------------- | 3501| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3502| 801 | this operation is not supported. | 3503| 17620001 | memory error. | 3504 3505**示例:** 3506 3507```ts 3508import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3509 3510let signer1 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 3511 3512let signer2 = cryptoFramework.createSign('RSA1024|PSS|SHA256|MGF1_SHA256'); 3513 3514let signer3 = cryptoFramework.createSign('ECC224|SHA256'); 3515 3516let signer4 = cryptoFramework.createSign('DSA2048|SHA256'); 3517 3518let signer5 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256|OnlySign'); 3519``` 3520 3521## Sign 3522 3523Sign类,使用Sign方法之前需要创建该类的实例进行操作,通过[createSign(algName: string): Sign](#cryptoframeworkcreatesign)方法构造此实例。按序调用本类中的init、update、sign方法完成签名操作。签名操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 3524 3525Sign类不支持重复初始化,当业务方需要使用新密钥签名时,需要重新创建新Sign对象并调用init初始化。 3526 3527业务方使用时,在createSign时确定签名的模式,调用init接口设置密钥。 3528 3529当待签名数据较短时,可在init初始化后,(无需update)直接调用sign接口传入原文数据进行签名。 3530 3531当待签名数据较长时,可通过update接口分段传入切分后的原文数据,最后调用sign接口对整体原文数据进行签名。 3532 3533当使用update分段传入原文时,sign接口API 10之前只支持传入DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用sign进行签名。 3534 3535当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 3536 3537### 属性 3538 3539**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3540 3541**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3542 3543API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3544 3545| 名称 | 类型 | 可读 | 可写 | 说明 | 3546| ------- | ------ | ---- | ---- | ---------------------------- | 3547| algName | string | 是 | 否 | 签名指定的算法名称。 | 3548 3549### init 3550 3551init(priKey: PriKey, callback: AsyncCallback\<void>): void 3552 3553使用私钥初始化Sign对象,通过注册回调函数获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。 3554 3555Sign类暂不支持重复init。 3556 3557**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3558 3559**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3560 3561API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3562 3563**参数:** 3564 3565| 参数名 | 类型 | 必填 | 说明 | 3566| -------- | -------------------- | ---- | ---------------- | 3567| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 3568| callback | AsyncCallback\<void> | 是 | 回调函数。当签名初始化成功,err为undefined,否则为错误对象。 | 3569 3570**错误码:** 3571以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3572 3573| 错误码ID | 错误信息 | 3574| -------- | ---------------------- | 3575| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3576| 17620001 | memory error. | 3577| 17620002 | runtime error. | 3578| 17630001 | crypto operation error. | 3579 3580### init 3581 3582init(priKey: PriKey): Promise\<void> 3583 3584使用私钥初始化Sign对象,通过Promise获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。 3585 3586Sign类暂不支持重复init。 3587 3588**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3589 3590**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3591 3592API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3593 3594**参数:** 3595 3596| 参数名 | 类型 | 必填 | 说明 | 3597| ------ | ---- | ---- | ---------------- | 3598| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 3599 3600**返回值:** 3601 3602| 类型 | 说明 | 3603| -------------- | ------------- | 3604| Promise\<void> | 无返回结果的Promise对象。 | 3605 3606**错误码:** 3607以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3608 3609| 错误码ID | 错误信息 | 3610| -------- | ---------------------- | 3611| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3612| 17620001 | memory error. | 3613| 17620002 | runtime error. | 3614| 17630001 | crypto operation error. | 3615 3616### initSync<sup>12+</sup> 3617 3618initSync(priKey: PriKey): void 3619 3620使用私钥初始化Sign对象,通过同步方式获取结果。initSync、updateSync、signSync为三段式接口,需要成组使用。其中initSync和signSync必选,updateSync可选。 3621 3622Sign类暂不支持重复initSync。 3623 3624**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3625 3626**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3627 3628**参数:** 3629 3630| 参数名 | 类型 | 必填 | 说明 | 3631| ------ | ---- | ---- | ---------------- | 3632| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 3633 3634**错误码:** 3635以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3636 3637| 错误码ID | 错误信息 | 3638| -------- | ---------------------- | 3639| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3640| 17620001 | memory error. | 3641| 17620002 | runtime error. | 3642| 17630001 | crypto operation error. | 3643 3644### update 3645 3646update(data: DataBlob, callback: AsyncCallback\<void>): void 3647 3648追加待签名数据,通过注册回调函数完成更新。 3649 3650必须在对[Sign](#sign)实例使用[init()](#init-2)初始化后,才能使用本函数。 3651 3652> **说明:** 3653> 3654> 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[sign](#sign-1))或多次调用update。<br/> 3655> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 3656> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 3657> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/> 3658> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 3659 3660**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3661 3662**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3663 3664API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3665 3666**参数:** 3667 3668| 参数名 | 类型 | 必填 | 说明 | 3669| -------- | --------------------- | ---- | ------------ | 3670| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 3671| callback | AsyncCallback\<void> | 是 | 回调函数。当签名更新成功,err为undefined,否则为错误对象。| 3672 3673**错误码:** 3674以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3675 3676| 错误码ID | 错误信息 | 3677| -------- | ---------------------- | 3678| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3679| 17620001 | memory error. | 3680| 17620002 | runtime error. | 3681| 17630001 | crypto operation error. | 3682 3683### update 3684 3685update(data: DataBlob): Promise\<void> 3686 3687追加待签名数据,通过Promise方式完成更新。 3688 3689必须在对[Sign](#sign)实例使用[init()](#init-3)初始化后,才能使用本函数。 3690 3691> **说明:** 3692> 3693> 根据数据量,可以不调用update(即[init](#init-3)完成后直接调用[sign](#sign-2))或多次调用update。<br/> 3694> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 3695> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 3696> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/> 3697> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 3698 3699**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3700 3701**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3702 3703API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3704 3705**参数:** 3706 3707| 参数名 | 类型 | 必填 | 说明 | 3708| ------ | -------- | ---- | ---------- | 3709| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 3710 3711**返回值:** 3712 3713| 类型 | 说明 | 3714| -------------- | ------------- | 3715| Promise\<void> | 无返回结果的Promise对象。 | 3716 3717**错误码:** 3718以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3719 3720| 错误码ID | 错误信息 | 3721| -------- | ---------------------- | 3722| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3723| 17620001 | memory error. | 3724| 17620002 | runtime error. | 3725| 17630001 | crypto operation error. | 3726 3727### updateSync<sup>12+</sup> 3728 3729updateSync(data: DataBlob): void 3730 3731追加待签名数据,通过同步方式完成更新。 3732 3733必须在对[Sign](#sign)实例使用[initSync()](#initsync12-1)初始化后,才能使用本函数。 3734 3735> **说明:** 3736> 3737> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-1)完成后直接调用[signSync](#signsync12))或多次调用updateSync。<br/> 3738> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/> 3739> 签名使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 3740> OnlySign模式下,不支持updateSync操作,需要直接使用signSync传入数据。<br/> 3741> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。 3742 3743**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3744 3745**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3746 3747**参数:** 3748 3749| 参数名 | 类型 | 必填 | 说明 | 3750| ------ | -------- | ---- | ---------- | 3751| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 3752 3753**返回值:** 3754 3755| 类型 | 说明 | 3756| -------------- | ------------- | 3757| void | 无返回结果。 | 3758 3759**错误码:** 3760以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3761 3762| 错误码ID | 错误信息 | 3763| -------- | ---------------------- | 3764| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3765| 17620001 | memory error. | 3766| 17620002 | runtime error. | 3767| 17630001 | crypto operation error. | 3768 3769### sign 3770 3771sign(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void 3772 3773对数据进行签名,通过注册回调函数获取签名结果。 3774 3775**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3776 3777**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3778 3779API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3780 3781**参数:** 3782 3783| 参数名 | 类型 | 必填 | 说明 | 3784| -------- | -------------------- | ---- | ---------- | 3785| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 3786| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 3787 3788**错误码:** 3789以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3790 3791| 错误码ID | 错误信息 | 3792| -------- | ---------------------- | 3793| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3794| 17620001 | memory error. | 3795| 17620002 | runtime error. | 3796| 17630001 | crypto operation error. | 3797 3798### sign 3799 3800sign(data: DataBlob | null): Promise\<DataBlob> 3801 3802对数据进行签名,通过Promise方式返回签名结果。 3803 3804**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3805 3806**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3807 3808API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3809 3810**参数:** 3811 3812| 参数名 | 类型 | 必填 | 说明 | 3813| ------ | -------- | ---- | ---------- | 3814| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。 | 3815 3816**返回值:** 3817 3818| 类型 | 说明 | 3819| -------------- | ------------- | 3820| Promise\<[DataBlob](#datablob)> | 返回签名结果。 | 3821 3822**错误码:** 3823以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3824 3825| 错误码ID | 错误信息 | 3826| -------- | ---------------------- | 3827| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3828| 17620001 | memory error. | 3829| 17620002 | runtime error. | 3830| 17630001 | crypto operation error. | 3831 3832### signSync<sup>12+</sup> 3833 3834signSync(data: DataBlob | null): DataBlob 3835 3836对数据进行签名,通过同步方式返回签名结果。 3837 3838**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3839 3840**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3841 3842**参数:** 3843 3844| 参数名 | 类型 | 必填 | 说明 | 3845| ------ | -------- | ---- | ---------- | 3846| data | [DataBlob](#datablob) \| null | 是 | 传入的消息。 | 3847 3848**返回值:** 3849 3850| 类型 | 说明 | 3851| -------------- | ------------- | 3852| [DataBlob](#datablob) | 返回签名结果。 | 3853 3854**错误码:** 3855以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3856 3857| 错误码ID | 错误信息 | 3858| -------- | ---------------------- | 3859| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3860| 17620001 | memory error. | 3861| 17620002 | runtime error. | 3862| 17630001 | crypto operation error. | 3863 3864**callback示例:** 3865 3866此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 3867 3868```ts 3869import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3870import { buffer } from '@kit.ArkTS'; 3871 3872function signByCallback() { 3873 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 3874 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 3875 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 3876 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 3877 let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData }; 3878 let priKeyBlob: cryptoFramework.DataBlob = { data: skData }; 3879 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 3880 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 3881 rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 3882 signer.init(keyPair.priKey, err => { 3883 signer.update(inputUpdate, err => { 3884 signer.sign(inputVerify, (err, signData) => { 3885 console.info('sign output is ' + signData.data); 3886 }); 3887 }); 3888 }); 3889 }); 3890} 3891``` 3892 3893**Promise示例:** 3894 3895此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 3896 3897```ts 3898import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3899import { buffer } from '@kit.ArkTS'; 3900 3901async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 3902 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 3903 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 3904 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 3905 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 3906 console.info('convertKey success'); 3907 return keyPair; 3908} 3909 3910async function signByPromise() { 3911 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 3912 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 3913 let keyPair = await genKeyPairByData(pkData, skData); 3914 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 3915 let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 3916 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 3917 await signer.init(keyPair.priKey); 3918 await signer.update(inputUpdate); 3919 let signData = await signer.sign(inputSign); 3920 console.info('signData result: ' + signData.data); 3921} 3922``` 3923 3924**Sync示例:** 3925 3926此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 3927 3928```ts 3929import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3930import { buffer } from '@kit.ArkTS'; 3931 3932function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 3933 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 3934 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 3935 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 3936 let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 3937 console.info('convertKeySync success'); 3938 return keyPair; 3939} 3940 3941function signBySync() { 3942 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 3943 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 3944 let keyPair = genKeyPairByData(pkData, skData); 3945 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 3946 let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 3947 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 3948 signer.initSync(keyPair.priKey); 3949 signer.updateSync(inputUpdate); 3950 let signData = signer.signSync(inputSign); 3951 console.info('signData result: ' + signData.data); 3952} 3953``` 3954 3955### setSignSpec<sup>10+</sup> 3956 3957setSignSpec(itemType: SignSpecItem, itemValue: number): void 3958 3959setSignSpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void 3960 3961设置签名参数。常用的签名参数可以直接通过[createSign](#cryptoframeworkcreatesign) 来指定,剩余参数可以通过本接口指定。 3962 3963只支持RSA算法、SM2算法,从API version11开始,支持SM2算法设置签名参数。 3964 3965**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3966 3967**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3968 3969API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3970 3971**参数:** 3972 3973| 参数名 | 类型 | 必填 | 说明 | 3974| -------- | -------------------- | ---- | ---------- | 3975| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要设置的签名参数。 | 3976| itemValue | number \| Uint8Array<sup>11+</sup> | 是 | 用于指定签名参数的具体值。 | 3977 3978**错误码:** 3979以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3980 3981| 错误码ID | 错误信息 | 3982| -------- | ---------------------- | 3983| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3984| 801 | this operation is not supported. | 3985| 17620001 | memory error. | 3986| 17630001 | crypto operation error. | 3987 3988**示例:** 3989 3990<!--code_no_check--> 3991```ts 3992let signer: cryptoFramework.Sign; // The process of generating the Sign instance is omitted here. 3993let setN = 20; 3994signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN); 3995``` 3996 3997### getSignSpec<sup>10+</sup> 3998 3999getSignSpec(itemType: SignSpecItem): string | number 4000 4001获取签名参数。当前只支持RSA算法。 4002 4003**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4004 4005**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4006 4007API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4008 4009**参数:** 4010 4011| 参数名 | 类型 | 必填 | 说明 | 4012| ------ | -------- | ---- | ---------- | 4013| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要获取的签名参数。 | 4014 4015**返回值:** 4016 4017| 类型 | 说明 | 4018| -------------- | ----------- | 4019| string \| number | 获取的签名参数的具体值。 | 4020 4021**错误码:** 4022以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4023 4024| 错误码ID | 错误信息 | 4025| -------- | ---------------------- | 4026| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4027| 801 | this operation is not supported. | 4028| 17620001 | memory error. | 4029| 17630001 | crypto operation error. | 4030 4031**示例:** 4032 4033<!--code_no_check--> 4034```ts 4035let signer: cryptoFramework.Sign; // The process of generating the Sign instance is omitted here. 4036let saltLen = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM); 4037``` 4038 4039## cryptoFramework.createVerify 4040 4041createVerify(algName: string): Verify 4042 4043Verify实例生成。 4044 4045支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。 4046 4047**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4048 4049**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4050 4051API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4052 4053**参数:** 4054 4055| 参数名 | 类型 | 必填 | 说明 | 4056| ------- | ------ | ---- | ------------------------------------------------------------ | 4057| algName | string | 是 | 指定签名算法:RSA,ECC,DSA,SM2<sup>10+</sup>或ED25519<sup>11+</sup>。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。<br/>使用RSA算法验签时,通过设置Recover参数可支持对签名后数据进行验签恢复。 | 4058 4059**返回值**: 4060 4061| 类型 | 说明 | 4062| ------ | ------------------------------------ | 4063| Verify | 返回由输入算法指定生成的Verify对象。 | 4064 4065**错误码:** 4066以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4067 4068| 错误码ID | 错误信息 | 4069| -------- | ---------------------- | 4070| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4071| 801 | this operation is not supported. | 4072| 17620001 | memory error. | 4073 4074**示例:** 4075 4076```ts 4077import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4078 4079let verifyer1 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4080 4081let verifyer2 = cryptoFramework.createVerify('RSA1024|PSS|SHA256|MGF1_SHA256'); 4082 4083let verifyer3 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover'); 4084``` 4085 4086## Verify 4087 4088Verify类,使用Verify方法之前需要创建该类的实例进行操作,通过[createVerify(algName: string): Verify](#cryptoframeworkcreateverify)方法构造此实例。按序调用本类中的init、update、verify方法完成签名操作。验签操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4089 4090Verify类不支持重复初始化,当业务方需要使用新密钥验签时,需要重新创建新Verify对象并调用init初始化。 4091 4092业务方使用时,在createVerify时确定验签的模式,调用init接口设置密钥。 4093 4094当被签名的消息较短时,可在init初始化后,(无需update)直接调用verify接口传入被签名的消息和签名(signatureData)进行验签。 4095 4096当被签名的消息较长时,可通过update接口分段传入被签名的消息,最后调用verify接口对消息全文进行验签。verify接口的data入参在API 10之前只支持DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用verify传入签名(signatureData)进行验签。 4097 4098当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4099 4100### 属性 4101 4102**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4103 4104**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4105 4106API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4107 4108| 名称 | 类型 | 可读 | 可写 | 说明 | 4109| ------- | ------ | ---- | ---- | ---------------------------- | 4110| algName | string | 是 | 否 | 验签指定的算法名称。 | 4111 4112### init 4113 4114init(pubKey: PubKey, callback: AsyncCallback\<void>): void 4115 4116传入公钥初始化Verify对象,通过注册回调函数获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。 4117 4118**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4119 4120**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4121 4122API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4123 4124**参数:** 4125 4126| 参数名 | 类型 | 必填 | 说明 | 4127| -------- | -------------------- | ---- | ------------------------------ | 4128| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4129| callback | AsyncCallback\<void> | 是 | 回调函数。当验签初始化成功,err为undefined,否则为错误对象。 | 4130 4131**错误码:** 4132以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4133 4134| 错误码ID | 错误信息 | 4135| -------- | ---------------------- | 4136| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4137| 17620001 | memory error. | 4138| 17620002 | runtime error. | 4139| 17630001 | crypto operation error. | 4140 4141### init 4142 4143init(pubKey: PubKey): Promise\<void> 4144 4145传入公钥初始化Verify对象,通过Promise获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。 4146 4147**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4148 4149**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4150 4151API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4152 4153**参数:** 4154 4155| 参数名 | 类型 | 必填 | 说明 | 4156| ------ | ---- | ---- | ---------------------------- | 4157| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4158 4159**返回值:** 4160 4161| 类型 | 说明 | 4162| -------------- | ------------- | 4163| Promise\<void> | 无返回结果的Promise对象。 | 4164 4165**错误码:** 4166以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4167 4168| 错误码ID | 错误信息 | 4169| -------- | ---------------------- | 4170| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4171| 17620001 | memory error. | 4172| 17620002 | runtime error. | 4173| 17630001 | crypto operation error. | 4174 4175### initSync<sup>12+</sup> 4176 4177initSync(pubKey: PubKey): void 4178 4179传入公钥初始化Verify对象,通过同步方式获取结果。initSync、updateSync、verifySync为三段式接口,需要成组使用。其中initSync和verifySync必选,updateSync可选。 4180 4181**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4182 4183**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4184 4185**参数:** 4186 4187| 参数名 | 类型 | 必填 | 说明 | 4188| ------ | ---- | ---- | ---------------------------- | 4189| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4190 4191**返回值:** 4192 4193| 类型 | 说明 | 4194| -------------- | ------------- | 4195| void | 无返回结果。 | 4196 4197**错误码:** 4198以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4199 4200| 错误码ID | 错误信息 | 4201| -------- | ---------------------- | 4202| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4203| 17620001 | memory error. | 4204| 17620002 | runtime error. | 4205| 17630001 | crypto operation error. | 4206 4207### update 4208 4209update(data: DataBlob, callback: AsyncCallback\<void>): void 4210 4211追加待验签数据,通过注册回调函数完成更新。 4212 4213必须在对[Verify](#verify)实例使用[init()](#init-4)初始化后,才能使用本函数。 4214 4215> **说明:** 4216> 4217> 根据数据量,可以不调用update(即[init](#init-4)完成后直接调用[verify](#verify-1))或多次调用update。<br/> 4218> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 4219> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4220> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4221 4222**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4223 4224**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4225 4226API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4227 4228**参数:** 4229 4230| 参数名 | 类型 | 必填 | 说明 | 4231| -------- | --------------------- | ---- | ------------ | 4232| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4233| callback | AsyncCallback\<void> | 是 | 回调函数。当验签更新成功,err为undefined,否则为错误对象。| 4234 4235**错误码:** 4236以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4237 4238| 错误码ID | 错误信息 | 4239| -------- | ---------------------- | 4240| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4241| 17620001 | memory error. | 4242| 17620002 | runtime error. | 4243| 17630001 | crypto operation error. | 4244 4245### update 4246 4247update(data: DataBlob): Promise\<void> 4248 4249追加待验签数据,通过Promise方式完成更新。 4250 4251必须在对[Verify](#verify)实例使用[init()](#init-5)初始化后,才能使用本函数。 4252 4253> **说明:** 4254> 4255> 根据数据量,可以不调用update(即[init](#init-5)完成后直接调用[verify](#verify-2))或多次调用update。<br/> 4256> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 4257> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4258> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4259 4260**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4261 4262**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4263 4264API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4265 4266**参数:** 4267 4268| 参数名 | 类型 | 必填 | 说明 | 4269| ------ | -------- | ---- | ---------- | 4270| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4271 4272**返回值:** 4273 4274| 类型 | 说明 | 4275| -------------- | ------------- | 4276| Promise\<void> | 无返回结果的Promise对象。 | 4277 4278**错误码:** 4279以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4280 4281| 错误码ID | 错误信息 | 4282| -------- | ---------------------- | 4283| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4284| 17620001 | memory error. | 4285| 17620002 | runtime error. | 4286| 17630001 | crypto operation error. | 4287 4288### updateSync<sup>12+</sup> 4289 4290updateSync(data: DataBlob): void 4291 4292追加待验签数据,通过同步方式完成更新。 4293 4294必须在对[Verify](#verify)实例使用[initSync()](#initsync12-2)初始化后,才能使用本函数。 4295 4296> **说明:** 4297> 4298> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-2)完成后直接调用[verifySync](#verifysync12))或多次调用updateSync。<br/> 4299> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/> 4300> 验签使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4301> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。 4302 4303**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4304 4305**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4306 4307**参数:** 4308 4309| 参数名 | 类型 | 必填 | 说明 | 4310| ------ | -------- | ---- | ---------- | 4311| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4312 4313**返回值:** 4314 4315| 类型 | 说明 | 4316| -------------- | ------------- | 4317| void | 无返回结果。 | 4318 4319**错误码:** 4320以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4321 4322| 错误码ID | 错误信息 | 4323| -------- | ---------------------- | 4324| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4325| 17620001 | memory error. | 4326| 17620002 | runtime error. | 4327| 17630001 | crypto operation error. | 4328 4329### verify 4330 4331verify(data: DataBlob | null, signatureData: DataBlob, callback: AsyncCallback\<boolean>): void 4332 4333对数据进行验签,通过注册回调函数返回返回验签结果。 4334 4335**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4336 4337**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4338 4339API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4340 4341**参数:** 4342 4343| 参数名 | 类型 | 必填 | 说明 | 4344| ------------- | -------------------- | ---- | ---------- | 4345| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 4346| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4347| callback | AsyncCallback\<boolean> | 是 | 回调函数,用于获取以boolean值表示的验签结果。 | 4348 4349**错误码:** 4350以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4351 4352| 错误码ID | 错误信息 | 4353| -------- | ---------------------- | 4354| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4355| 17620001 | memory error. | 4356| 17620002 | runtime error. | 4357| 17630001 | crypto operation error. | 4358 4359### verify 4360 4361verify(data: DataBlob | null, signatureData: DataBlob): Promise\<boolean> 4362 4363对数据进行验签,通过Promise返回验签结果。 4364 4365**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4366 4367**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4368 4369API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4370 4371**参数:** 4372 4373| 参数名 | 类型 | 必填 | 说明 | 4374| ------------- | -------- | ---- | ---------- | 4375| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 4376| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4377 4378**返回值:** 4379 4380| 类型 | 说明 | 4381| ----------------- | ------------------------------ | 4382| Promise\<boolean> | 异步返回值,代表验签是否通过。 | 4383 4384**错误码:** 4385以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4386 4387| 错误码ID | 错误信息 | 4388| -------- | ---------------------- | 4389| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4390| 17620001 | memory error. | 4391| 17620002 | runtime error. | 4392| 17630001 | crypto operation error. | 4393 4394### verifySync<sup>12+</sup> 4395 4396verifySync(data: DataBlob | null, signatureData: DataBlob): boolean 4397 4398对数据进行验签,通过同步方式返回验签结果。 4399 4400**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4401 4402**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4403 4404**参数:** 4405 4406| 参数名 | 类型 | 必填 | 说明 | 4407| ------------- | -------- | ---- | ---------- | 4408| data | [DataBlob](#datablob) \| null | 是 | 传入的消息。 | 4409| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4410 4411**返回值:** 4412 4413| 类型 | 说明 | 4414| ----------------- | ------------------------------ | 4415| boolean | 同步返回值,代表验签是否通过。 | 4416 4417**错误码:** 4418以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4419 4420| 错误码ID | 错误信息 | 4421| -------- | ---------------------- | 4422| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4423| 17620001 | memory error. | 4424| 17620002 | runtime error. | 4425| 17630001 | crypto operation error. | 4426 4427**callback示例:** 4428 4429此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4430 4431```ts 4432import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4433import { buffer } from '@kit.ArkTS'; 4434 4435function verifyByCallback() { 4436 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4437 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4438 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过 4439 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 4440 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 4441 let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData }; 4442 let priKeyBlob: cryptoFramework.DataBlob = { data: skData }; 4443 // 该数据取自Sign中的signData.data 4444 let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) } 4445 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4446 let verifyer = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4447 rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 4448 verifyer.init(keyPair.pubKey, err => { 4449 verifyer.update(inputUpdate, err => { 4450 verifyer.verify(inputVerify, signMessageBlob, (err, res) => { 4451 console.info('verify result is ' + res); 4452 }); 4453 }); 4454 }); 4455 }); 4456} 4457``` 4458 4459**Promise示例:** 4460 4461此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4462 4463```ts 4464import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4465import { buffer } from '@kit.ArkTS'; 4466 4467async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 4468 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 4469 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 4470 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4471 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 4472 console.info('convertKey success'); 4473 return keyPair; 4474} 4475 4476async function verifyByPromise() { 4477 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过 4478 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 4479 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 4480 let keyPair = await genKeyPairByData(pkData, skData); 4481 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4482 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4483 // 该数据取自Sign中的signData.data 4484 let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) }; 4485 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4486 await verifier.init(keyPair.pubKey); 4487 await verifier.update(inputUpdate); 4488 let res = await verifier.verify(inputVerify, signMessageBlob); 4489 console.info('verify result: ' + res); 4490} 4491``` 4492 4493**Sync示例:** 4494 4495此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4496 4497```ts 4498import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4499import { buffer } from '@kit.ArkTS'; 4500 4501function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 4502 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 4503 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 4504 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4505 let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 4506 console.info('convertKey success'); 4507 return keyPair; 4508} 4509 4510function verifyBySync() { 4511 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过 4512 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 4513 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 4514 let keyPair = genKeyPairByData(pkData, skData); 4515 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4516 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4517 // 该数据取自Sign中的signData.data 4518 let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) }; 4519 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4520 verifier.initSync(keyPair.pubKey); 4521 verifier.updateSync(inputUpdate); 4522 let res = verifier.verifySync(inputVerify, signMessageBlob); 4523 console.info('verify result: ' + res); 4524} 4525``` 4526 4527### recover<sup>12+</sup> 4528 4529recover(signatureData: DataBlob): Promise\<DataBlob | null> 4530 4531对数据进行签名恢复原始数据,通过Promise返回恢复结果。 4532 4533> **说明:** 4534> 4535> - 目前仅RSA支持。 4536 4537**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4538 4539**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4540 4541**参数:** 4542 4543| 参数名 | 类型 | 必填 | 说明 | 4544| ------------- | -------- | ---- | ---------- | 4545| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4546 4547**返回值:** 4548 4549| 类型 | 说明 | 4550| ----------------- | ------------------------------ | 4551| Promise\<[DataBlob](#datablob) \| null> | 验签恢复的数据。 | 4552 4553**错误码:** 4554以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4555 4556| 错误码ID | 错误信息 | 4557| -------- | ---------------------- | 4558| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4559| 17620001 | memory error. | 4560| 17620002 | runtime error. | 4561| 17630001 | crypto operation error. | 4562 4563**示例:** 4564 4565```ts 4566import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4567import { buffer } from '@kit.ArkTS'; 4568 4569async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 4570 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 4571 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 4572 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4573 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 4574 console.info('convertKey success'); 4575 return keyPair; 4576} 4577 4578async function recoverByPromise() { 4579 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过 4580 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 4581 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 4582 let keyPair = await genKeyPairByData(pkData, skData); 4583 // 该数据取自Sign中的signData.data 4584 let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) }; 4585 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover'); 4586 await verifier.init(keyPair.pubKey); 4587 try { 4588 let rawSignData = await verifier.recover(signMessageBlob); 4589 if (rawSignData != null) { 4590 console.info('[Promise]: recover result: ' + rawSignData.data); 4591 } else { 4592 console.error("[Promise]: get verify recover result fail!"); 4593 } 4594 } catch (error) { 4595 let e: BusinessError = error as BusinessError; 4596 console.error(`promise error, ${e.code}, ${e.message}`); 4597 } 4598} 4599``` 4600 4601### recoverSync<sup>12+</sup> 4602 4603recoverSync(signatureData: DataBlob): DataBlob | null 4604 4605对数据进行签名恢复原始数据。 4606 4607> **说明:** 4608> 4609> - 目前仅RSA支持。 4610 4611**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4612 4613**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4614 4615**参数:** 4616 4617| 参数名 | 类型 | 必填 | 说明 | 4618| ------------- | -------- | ---- | ---------- | 4619| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4620 4621**返回值:** 4622 4623| 类型 | 说明 | 4624| ----------------- | ------------------------------ | 4625| [DataBlob](#datablob) \| null | 验签恢复的数据。 | 4626 4627**错误码:** 4628以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4629 4630| 错误码ID | 错误信息 | 4631| -------- | ---------------------- | 4632| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4633| 17620001 | memory error. | 4634| 17620002 | runtime error. | 4635| 17630001 | crypto operation error. | 4636 4637### setVerifySpec<sup>10+</sup> 4638 4639setVerifySpec(itemType: SignSpecItem, itemValue: number): void 4640 4641setVerifySpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void 4642 4643设置验签参数。常用的签名参数可以直接通过[createVerify](#cryptoframeworkcreateverify) 来指定,剩余参数可以通过本接口指定。 4644 4645只支持RSA算法、SM2算法,从API version 11开始,支持SM2算法设置验签参数。 4646 4647验签的参数应当与签名的参数保持一致。 4648 4649**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4650 4651**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4652 4653API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4654 4655**参数:** 4656 4657| 参数名 | 类型 | 必填 | 说明 | 4658| -------- | -------------------- | ---- | ---------- | 4659| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要设置的验签参数。 | 4660| itemValue | number \| Uint8Array<sup>11+</sup> | 是 | 用于指定验签参数的具体值。 | 4661 4662**错误码:** 4663以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4664 4665| 错误码ID | 错误信息 | 4666| -------- | ---------------------- | 4667| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4668| 801 | this operation is not supported. | 4669| 17620001 | memory error. | 4670| 17630001 | crypto operation error. | 4671 4672**示例:** 4673 4674<!--code_no_check--> 4675```ts 4676let verifyer: cryptoFramework.Verify; // The process of generating the Verify instance is omitted here. 4677let setN = 20; 4678verifyer.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN); 4679``` 4680 4681### getVerifySpec<sup>10+</sup> 4682 4683getVerifySpec(itemType: SignSpecItem): string | number 4684 4685获取验签参数。当前只支持RSA算法。 4686 4687验签的参数应当与签名的参数保持一致。 4688 4689**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4690 4691**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4692 4693API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4694 4695**参数:** 4696 4697| 参数名 | 类型 | 必填 | 说明 | 4698| ------ | -------- | ---- | ---------- | 4699| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要获取的验签参数。 | 4700 4701**返回值:** 4702 4703| 类型 | 说明 | 4704| -------------- | ----------- | 4705| string \| number | 获取的验签参数的具体值。 | 4706 4707**错误码:** 4708以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4709 4710| 错误码ID | 错误信息 | 4711| -------- | ---------------------- | 4712| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4713| 801 | this operation is not supported. | 4714| 17620001 | memory error. | 4715| 17630001 | crypto operation error. | 4716 4717**示例:** 4718 4719<!--code_no_check--> 4720```ts 4721let verifyer: cryptoFramework.Verify; // The process of generating the Verify instance is omitted here. 4722let saltLen = verifyer.getVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM); 4723``` 4724 4725## cryptoFramework.createKeyAgreement 4726 4727createKeyAgreement(algName: string): KeyAgreement 4728 4729KeyAgreement实例生成。 4730 4731支持的规格详见[密钥协商规格](../../security/CryptoArchitectureKit/crypto-key-agreement-overview.md)。 4732 4733**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4734 4735**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4736 4737API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement 4738 4739**参数:** 4740 4741| 参数名 | 类型 | 必填 | 说明 | 4742| ------- | ------ | ---- | ------------------------------------------------------------ | 4743| algName | string | 是 | 指定密钥协商算法:目前仅支持ECC,从API version 11开始,增加支持X25519和DH。 | 4744 4745**返回值**: 4746 4747| 类型 | 说明 | 4748| ------------ | ------------------------------------------ | 4749| KeyAgreement | 返回由输入算法指定生成的KeyAgreement对象。 | 4750 4751**错误码:** 4752以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4753 4754| 错误码ID | 错误信息 | 4755| -------- | ---------------------- | 4756| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4757| 801 | this operation is not supported. | 4758| 17620001 | memory error. | 4759 4760**示例:** 4761 4762```ts 4763import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4764 4765let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 4766``` 4767 4768## KeyAgreement 4769 4770KeyAgreement类,使用密钥协商方法之前需要创建该类的实例进行操作,通过[createKeyAgreement(algName: string): KeyAgreement](#cryptoframeworkcreatekeyagreement)方法构造此实例。 4771 4772### 属性 4773 4774**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4775 4776**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4777 4778API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement 4779 4780| 名称 | 类型 | 可读 | 可写 | 说明 | 4781| ------- | ------ | ---- | ---- | ---------------------------- | 4782| algName | string | 是 | 否 | 密钥协商指定的算法名称。 | 4783 4784### generateSecret 4785 4786generateSecret(priKey: PriKey, pubKey: PubKey, callback: AsyncCallback\<DataBlob>): void 4787 4788基于传入的私钥与公钥进行密钥协商,通过注册回调函数返回共享密钥。 4789 4790**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4791 4792**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4793 4794API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement 4795 4796**参数:** 4797 4798| 参数名 | 类型 | 必填 | 说明 | 4799| -------- | ------------------------ | ---- | ---------------------- | 4800| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 4801| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 4802| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 异步接受共享密钥的回调。 | 4803 4804**错误码:** 4805以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4806 4807| 错误码ID | 错误信息 | 4808| -------- | ---------------------- | 4809| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4810| 17620001 | memory error. | 4811| 17620002 | runtime error. | 4812| 17630001 | crypto operation error. | 4813 4814### generateSecret 4815 4816generateSecret(priKey: PriKey, pubKey: PubKey): Promise\<DataBlob> 4817 4818基于传入的私钥与公钥进行密钥协商,通过Promise返回共享密钥。 4819 4820**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4821 4822**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4823 4824API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement 4825 4826**参数:** 4827 4828| 参数名 | 类型 | 必填 | 说明 | 4829| ------ | ------ | ---- | ---------------------- | 4830| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 4831| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 4832 4833**返回值:** 4834 4835| 类型 | 说明 | 4836| ------------------ | -------- | 4837| Promise\<[DataBlob](#datablob)> | 共享密钥。 | 4838 4839**错误码:** 4840以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4841 4842| 错误码ID | 错误信息 | 4843| -------- | ---------------------- | 4844| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4845| 17620001 | memory error. | 4846| 17620002 | runtime error. | 4847| 17630001 | crypto operation error. | 4848 4849### generateSecretSync<sup>12+</sup> 4850 4851generateSecretSync(priKey: PriKey, pubKey: PubKey): DataBlob 4852 4853基于传入的私钥与公钥进行密钥协商,通过同步返回共享密钥。 4854 4855**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4856 4857**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4858 4859**参数:** 4860 4861| 参数名 | 类型 | 必填 | 说明 | 4862| ------ | ------ | ---- | ---------------------- | 4863| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 4864| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 4865 4866**返回值:** 4867 4868| 类型 | 说明 | 4869| ------------------ | -------- | 4870|[DataBlob](#datablob) | 共享密钥。 | 4871 4872**错误码:** 4873以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4874 4875| 错误码ID | 错误信息 | 4876| -------- | ---------------------- | 4877| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4878| 17620001 | memory error. | 4879| 17620002 | runtime error. | 4880| 17630001 | crypto operation error. | 4881 4882**callback示例:** 4883 4884<!--code_no_check--> 4885```ts 4886import { BusinessError } from '@kit.BasicServicesKit'; 4887 4888let globalKeyPair: cryptoFramework.KeyPair; // globalKeyPair is an asymmetric key object generated by the asymmetric key generator. The generation process is omitted here. 4889let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 4890keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey, (err, secret) => { 4891 if (err) { 4892 console.error("keyAgreement error."); 4893 return; 4894 } 4895 console.info('keyAgreement output is ' + secret.data); 4896}); 4897``` 4898 4899**Promise示例:** 4900 4901<!--code_no_check--> 4902```ts 4903import { BusinessError } from '@kit.BasicServicesKit'; 4904 4905let globalKeyPair: cryptoFramework.KeyPair; // globalKeyPair is an asymmetric key object generated by the asymmetric key generator. The generation process is omitted here. 4906let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 4907let keyAgreementPromise = keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey); 4908keyAgreementPromise.then(secret => { 4909 console.info('keyAgreement output is ' + secret.data); 4910}).catch((error: BusinessError) => { 4911 console.error("keyAgreement error."); 4912}); 4913``` 4914 4915**Sync示例:** 4916 4917<!--code_no_check--> 4918```ts 4919let asyGenerator = cryptoFramework.CreateAsyKeyGenerator("ECC256"); 4920let globalKeyPair = asyGenerator.generateKeyPairSync(); 4921let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 4922let secret = keyAgreement.generateSecretSync(globalKeyPair.priKey, globalKeyPair.pubKey); 4923console.info("[Sync]keyAgreement output is " + secret.data); 4924``` 4925 4926## cryptoFramework.createMd 4927 4928createMd(algName: string): Md 4929 4930生成Md实例,用于进行消息摘要的计算与操作。 4931 4932支持的规格详见[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#支持的算法与规格)。 4933 4934**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4935 4936**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 4937 4938API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 4939 4940**参数:** 4941 4942| 参数名 | 类型 | 必填 | 说明 | 4943| ------- | ------ | ---- | ------------------------------------------------------------ | 4944| algName | string | 是 | 指定摘要算法,支持算法请参考[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#支持的算法与规格)。 | 4945 4946**返回值**: 4947 4948| 类型 | 说明 | 4949| ---- | --------------------------------------- | 4950| Md | 返回由输入算法指定生成的[Md](#md)对象。 | 4951 4952**错误码:** 4953以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4954 4955| 错误码ID | 错误信息 | 4956| -------- | ------------------ | 4957| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4958| 17620001 | memory error. | 4959 4960**示例:** 4961 4962```ts 4963import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4964import { BusinessError } from '@kit.BasicServicesKit'; 4965 4966try { 4967 // Set algName based on the algorithm supported. 4968 let md = cryptoFramework.createMd('SHA256'); 4969} catch (error) { 4970 let e: BusinessError = error as BusinessError; 4971 console.error(`sync error, ${e.code}, ${e.message}`); 4972} 4973``` 4974 4975## Md 4976 4977Md类,调用Md方法可以进行MD(Message Digest)摘要计算。调用前,需要通过[createMd](#cryptoframeworkcreatemd)构造Md实例。 4978 4979### 属性 4980 4981**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4982 4983**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 4984 4985API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 4986 4987| 名称 | 类型 | 可读 | 可写 | 说明 | 4988| ------- | ------ | ---- | ---- | ---------------------- | 4989| algName | string | 是 | 否 | 代表指定的摘要算法名。 | 4990 4991### update 4992 4993update(input: DataBlob, callback: AsyncCallback\<void>): void 4994 4995传入消息进行Md更新计算,通过注册回调函数更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。 4996 4997> **说明:** 4998> 4999> - Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 5000> 5001> - 该接口不支持轻量级智能穿戴。 5002 5003**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5004 5005**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5006 5007API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5008 5009**参数:** 5010 5011| 参数名 | 类型 | 必填 | 说明 | 5012| -------- | --------------------- | ---- | ------------ | 5013| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5014| callback | AsyncCallback\<void> | 是 | 回调函数。当摘要更新成功,err为undefined,否则为错误对象。 | 5015 5016**错误码:** 5017以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5018 5019| 错误码ID | 错误信息 | 5020| -------- | ---------------------- | 5021| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5022| 17630001 | crypto operation error. | 5023 5024### update 5025 5026update(input: DataBlob): Promise\<void> 5027 5028传入消息进行Md更新计算,通过Promise更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。 5029 5030> **说明:** 5031> 5032> - Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 5033> 5034> - 该接口不支持轻量级智能穿戴。 5035 5036**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5037 5038**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5039 5040API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5041 5042| 参数名 | 类型 | 必填 | 说明 | 5043| ------ | -------- | ---- | ------------ | 5044| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5045 5046**返回值:** 5047 5048| 类型 | 说明 | 5049| -------------- | ------------- | 5050| Promise\<void> | 无返回结果的Promise对象。 | 5051 5052**错误码:** 5053以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5054 5055| 错误码ID | 错误信息 | 5056| -------- | ---------------------- | 5057| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5058| 17630001 | crypto operation error. | 5059 5060### updateSync<sup>12+</sup> 5061 5062updateSync(input: DataBlob): void 5063 5064传入消息进行Md更新计算,通过同步方式更新。updateSync和digestSync为两段式接口,需要成组使用。其中digestSync必选,updateSync可选。 5065 5066> **说明:** 5067> 5068> Md算法多次调用updateSync更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 5069 5070**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5071 5072**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5073 5074| 参数名 | 类型 | 必填 | 说明 | 5075| ------ | -------- | ---- | ------------ | 5076| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5077 5078**返回值:** 5079 5080| 类型 | 说明 | 5081| -------------- | ------------- | 5082| void | 无返回结果。 | 5083 5084**错误码:** 5085以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5086 5087| 错误码ID | 错误信息 | 5088| -------- | ---------------------- | 5089| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5090| 17630001 | crypto operation error. | 5091 5092### digest 5093 5094digest(callback: AsyncCallback\<DataBlob>): void 5095 5096通过注册回调函数返回Md的计算结果。 5097 5098> **说明:** 5099> 5100> 该接口不支持轻量级智能穿戴。 5101 5102**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5103 5104**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5105 5106API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5107 5108| 参数名 | 类型 | 必填 | 说明 | 5109| -------- | ------------------------ | ---- | ---------- | 5110| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 5111 5112**错误码:** 5113以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5114 5115| 错误码ID | 错误信息 | 5116| -------- | ---------------------- | 5117| 17620001 | memory error. | 5118| 17630001 | crypto operation error. | 5119 5120**示例:** 5121 5122```ts 5123import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5124import { buffer } from '@kit.ArkTS'; 5125 5126function mdByCallback() { 5127 let md = cryptoFramework.createMd('SHA256'); 5128 md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }, (err,) => { 5129 md.digest((err, digestOutput) => { 5130 console.info('[Callback]: MD result: ' + digestOutput.data); 5131 console.info('[Callback]: MD len: ' + md.getMdLength()); 5132 }); 5133 }); 5134} 5135``` 5136 5137### digest 5138 5139digest(): Promise\<DataBlob> 5140 5141通过Promise返回Md的计算结果。 5142 5143> **说明:** 5144> 5145> 该接口不支持轻量级智能穿戴。 5146 5147**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5148 5149**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5150 5151API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5152 5153**返回值:** 5154 5155| 类型 | 说明 | 5156| ------------------ | ----------- | 5157| Promise\<[DataBlob](#datablob)> | Promise对象。 | 5158 5159**错误码:** 5160以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5161 5162| 错误码ID | 错误信息 | 5163| -------- | ---------------------- | 5164| 17620001 | memory error. | 5165| 17630001 | crypto operation error. | 5166 5167**示例:** 5168 5169```ts 5170import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5171import { buffer } from '@kit.ArkTS'; 5172 5173async function mdByPromise() { 5174 let md = cryptoFramework.createMd('SHA256'); 5175 await md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }); 5176 let mdOutput = await md.digest(); 5177 console.info('[Promise]: MD result: ' + mdOutput.data); 5178 console.info('[Promise]: MD len: ' + md.getMdLength()); 5179} 5180``` 5181 5182### digestSync<sup>12+</sup> 5183 5184digestSync(): DataBlob 5185 5186通过同步方式返回Md的计算结果。 5187 5188**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5189 5190**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5191 5192**返回值:** 5193 5194| 类型 | 说明 | 5195| ------------------ | ----------- | 5196| [DataBlob](#datablob) | 表示生成的Md计算结果。 | 5197 5198**错误码:** 5199以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5200 5201| 错误码ID | 错误信息 | 5202| -------- | ---------------------- | 5203| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5204| 17620001 | memory error. | 5205| 17620002 | runtime error. | 5206| 17630001 | crypto operation error. | 5207 5208**示例:** 5209 5210```ts 5211import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5212import { buffer } from '@kit.ArkTS'; 5213 5214async function mdBySync() { 5215 let md = cryptoFramework.createMd('SHA256'); 5216 md.updateSync({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }); 5217 let mdOutput = md.digestSync(); 5218 console.info('[Sync]: MD result: ' + mdOutput.data); 5219 console.info('[Sync]: MD len: ' + md.getMdLength()); 5220} 5221``` 5222 5223### getMdLength 5224 5225getMdLength(): number 5226 5227获取Md消息摘要长度(字节数)。 5228 5229**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5230 5231**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5232 5233API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5234 5235**返回值:** 5236 5237| 类型 | 说明 | 5238| ------ | -------------------------- | 5239| number | 返回md计算结果的字节长度。 | 5240 5241**错误码:** 5242以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5243 5244| 错误码ID | 错误信息 | 5245| -------- | ---------------------- | 5246| 17630001 | crypto operation error. | 5247 5248**示例:** 5249 5250```ts 5251import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5252 5253function getLength() { 5254 let md = cryptoFramework.createMd('SHA256'); 5255 console.info('[Promise]: MD len: ' + md.getMdLength()); 5256} 5257``` 5258 5259## cryptoFramework.createMac 5260 5261createMac(algName: string): Mac 5262 5263生成Mac实例,用于进行消息认证码的计算与操作。 5264 5265支持的规格详见[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac.md#支持的算法与规格)。 5266 5267**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5268 5269**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5270 5271API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5272 5273**参数:** 5274 5275| 参数名 | 类型 | 必填 | 说明 | 5276| ------- | ------ | ---- | ------------------------------------------------------------ | 5277| algName | string | 是 | 指定摘要算法,支持算法请参考[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac.md#支持的算法与规格)。 | 5278 5279**返回值**: 5280 5281| 类型 | 说明 | 5282| ---- | ----------------------------------------- | 5283| Mac | 返回由输入算法指定生成的[Mac](#mac)对象。 | 5284 5285**错误码:** 5286以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5287 5288| 错误码ID | 错误信息 | 5289| -------- | ------------------ | 5290| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5291| 17620001 | memory error. | 5292 5293**示例:** 5294 5295```ts 5296import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5297import { BusinessError } from '@kit.BasicServicesKit'; 5298 5299try { 5300 // Set algName based on the algorithm supported. 5301 let mac = cryptoFramework.createMac('SHA256'); 5302} catch (error) { 5303 let e: BusinessError = error as BusinessError; 5304 console.error(`sync error, ${e.code}, ${e.message}`); 5305} 5306``` 5307 5308## Mac 5309 5310Mac类,调用Mac方法可以进行MAC(Message Authentication Code)加密计算。调用前,需要通过[createMac](#cryptoframeworkcreatemac)构造Mac实例。 5311 5312### 属性 5313 5314**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5315 5316**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5317 5318API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5319 5320| 名称 | 类型 | 可读 | 可写 | 说明 | 5321| ------- | ------ | ---- | ---- | ---------------------- | 5322| algName | string | 是 | 否 | 代表指定的摘要算法名。 | 5323 5324### init 5325 5326init(key: SymKey, callback: AsyncCallback\<void>): void 5327 5328使用对称密钥初始化Mac计算,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 5329 5330 > **说明:** 5331 > 5332 > 建议通过[HMAC密钥生成规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md#hmac)创建对称密钥生成器,调用[generateSymKey](#generatesymkey)随机生成对称密钥或调用[convertKey](#convertkey)传入与密钥规格长度一致的二进制密钥数据生成密钥。<br/>当指定“HMAC”生成对称密钥生成器时,仅支持调用[convertKey](#convertkey)传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据生成密钥。 5333 5334**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5335 5336**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5337 5338API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5339 5340**参数:** 5341 5342| 参数名 | 类型 | 必填 | 说明 | 5343| -------- | -------------------- | ---- | -------------- | 5344| key | [SymKey](#symkey) | 是 | 共享对称密钥。 | 5345| callback | AsyncCallback\<void> | 是 | 回调函数。当HMAC初始化成功,err为undefined,否则为错误对象。 | 5346 5347**错误码:** 5348以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5349 5350| 错误码ID | 错误信息 | 5351| -------- | ---------------------- | 5352| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5353| 17630001 | crypto operation error. | 5354 5355### init 5356 5357init(key: SymKey): Promise\<void> 5358 5359使用对称密钥初始化Mac计算,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 5360 5361**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5362 5363**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5364 5365API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5366 5367**参数:** 5368 5369| 参数名 | 类型 | 必填 | 说明 | 5370| ------ | ------ | ---- | ------------ | 5371| key | [SymKey](#symkey) | 是 | 共享对称密钥。 | 5372 5373**返回值:** 5374 5375| 类型 | 说明 | 5376| -------------- | ------------- | 5377| Promise\<void> | 无返回结果的Promise对象。 | 5378 5379**错误码:** 5380以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5381 5382| 错误码ID | 错误信息 | 5383| -------- | ---------------------- | 5384| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5385| 17630001 | crypto operation error. | 5386 5387### initSync<sup>12+</sup> 5388 5389initSync(key: SymKey): void 5390 5391使用对称密钥初始化Mac计算,通过同步方式获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。 5392 5393**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5394 5395**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5396 5397**参数:** 5398 5399| 参数名 | 类型 | 必填 | 说明 | 5400| ------ | ------ | ---- | ------------ | 5401| key | [SymKey](#symkey) | 是 | 共享对称密钥。 | 5402 5403**返回值:** 5404 5405| 类型 | 说明 | 5406| -------------- | ------------- | 5407| void | 无返回结果。 | 5408 5409**错误码:** 5410以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5411 5412| 错误码ID | 错误信息 | 5413| -------- | ---------------------- | 5414| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5415| 17630001 | crypto operation error. | 5416 5417### update 5418 5419update(input: DataBlob, callback: AsyncCallback\<void>): void 5420 5421传入消息进行Mac更新计算,通过注册回调函数获取结果。 5422 5423> **说明:** 5424> 5425> HMAC算法多次调用update更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5426 5427**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5428 5429**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5430 5431API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5432 5433**参数:** 5434 5435| 参数名 | 类型 | 必填 | 说明 | 5436| -------- | --------------------- | ---- | ------------ | 5437| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5438| callback | AsyncCallback\<void> | 是 | 回调函数。当HMAC更新成功,err为undefined,否则为错误对象。| 5439 5440**错误码:** 5441以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5442 5443| 错误码ID | 错误信息 | 5444| -------- | ---------------------- | 5445| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5446| 17630001 | crypto operation error. | 5447 5448### update 5449 5450update(input: DataBlob): Promise\<void> 5451 5452传入消息进行Mac更新计算,通过Promise获取结果。 5453 5454> **说明:** 5455> 5456> HMAC算法多次调用update更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5457 5458**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5459 5460**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5461 5462API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5463 5464**参数:** 5465 5466| 参数名 | 类型 | 必填 | 说明 | 5467| ------ | -------- | ---- | ---------- | 5468| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5469 5470**返回值:** 5471 5472| 类型 | 说明 | 5473| -------------- | ------------- | 5474| Promise\<void> | 无返回结果的Promise对象。 | 5475 5476**错误码:** 5477以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5478 5479| 错误码ID | 错误信息 | 5480| -------- | ---------------------- | 5481| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5482| 17630001 | crypto operation error. | 5483 5484### updateSync<sup>12+</sup> 5485 5486updateSync(input: DataBlob): void 5487 5488传入消息进行Mac更新计算,通过同步方式获取结果。 5489 5490> **说明:** 5491> 5492> HMAC算法多次调用updateSync更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5493 5494**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5495 5496**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5497 5498**参数:** 5499 5500| 参数名 | 类型 | 必填 | 说明 | 5501| ------ | -------- | ---- | ---------- | 5502| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5503 5504**返回值:** 5505 5506| 类型 | 说明 | 5507| -------------- | ------------- | 5508| void | 无返回结果的对象。 | 5509 5510**错误码:** 5511以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5512 5513| 错误码ID | 错误信息 | 5514| -------- | ---------------------- | 5515| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5516| 17630001 | crypto operation error. | 5517 5518### doFinal 5519 5520doFinal(callback: AsyncCallback\<DataBlob>): void 5521 5522通过注册回调函数返回Mac的计算结果。 5523 5524**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5525 5526**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5527 5528API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5529 5530**参数:** 5531 5532| 参数名 | 类型 | 必填 | 说明 | 5533| -------- | ------------------------ | ---- | -------- | 5534| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 5535 5536**错误码:** 5537以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5538 5539| 错误码ID | 错误信息 | 5540| -------- | ---------------------- | 5541| 17620001 | memory error. | 5542| 17630001 | crypto operation error. | 5543 5544**示例:** 5545 5546此外,更多HMAC的完整示例可参考开发指导中[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5547 5548```ts 5549import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5550import { buffer } from '@kit.ArkTS'; 5551 5552function hmacByCallback() { 5553 let mac = cryptoFramework.createMac('SHA256'); 5554 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 5555 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 5556 symKeyGenerator.convertKey(keyBlob, (err, symKey) => { 5557 mac.init(symKey, (err,) => { 5558 mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }, (err,) => { 5559 mac.doFinal((err, output) => { 5560 console.info('[Callback]: HMAC result: ' + output.data); 5561 console.info('[Callback]: MAC len: ' + mac.getMacLength()); 5562 }); 5563 }); 5564 }); 5565 }); 5566} 5567``` 5568 5569### doFinal 5570 5571doFinal(): Promise\<DataBlob> 5572 5573通过Promise返回Mac的计算结果。 5574 5575**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5576 5577**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5578 5579API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5580 5581**返回值:** 5582 5583| 类型 | 说明 | 5584| ------------------ | ----------- | 5585| Promise\<[DataBlob](#datablob)> | Promise对象。 | 5586 5587**错误码:** 5588以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5589 5590| 错误码ID | 错误信息 | 5591| -------- | ---------------------- | 5592| 17620001 | memory error. | 5593| 17630001 | crypto operation error. | 5594 5595**示例:** 5596 5597此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5598 5599```ts 5600import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5601import { buffer } from '@kit.ArkTS'; 5602 5603async function hmacByPromise() { 5604 let mac = cryptoFramework.createMac('SHA256'); 5605 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 5606 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 5607 let symKey = await symKeyGenerator.convertKey(keyBlob); 5608 await mac.init(symKey); 5609 await mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }); 5610 let macOutput = await mac.doFinal(); 5611 console.info('[Promise]: HMAC result: ' + macOutput.data); 5612 console.info('[Promise]: MAC len: ' + mac.getMacLength()); 5613} 5614``` 5615 5616### doFinalSync<sup>12+</sup> 5617 5618doFinalSync(): DataBlob 5619 5620通过同步方式返回Mac的计算结果。 5621 5622**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5623 5624**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5625 5626**返回值:** 5627 5628| 类型 | 说明 | 5629| ------------------ | ----------- | 5630| [DataBlob](#datablob) | 返回Mac的计算结果。 | 5631 5632**错误码:** 5633以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5634 5635| 错误码ID | 错误信息 | 5636| -------- | ---------------------- | 5637| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5638| 17620001 | memory error. | 5639| 17620002 | runtime error. | 5640| 17630001 | crypto operation error. | 5641 5642**示例:** 5643 5644此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5645 5646```ts 5647import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5648import { buffer } from '@kit.ArkTS'; 5649 5650function hmacBySync() { 5651 let mac = cryptoFramework.createMac('SHA256'); 5652 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 5653 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 5654 let symKey = symKeyGenerator.convertKeySync(keyBlob); 5655 mac.initSync(symKey); 5656 mac.updateSync({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }); 5657 let macOutput = mac.doFinalSync(); 5658 console.info('[Sync]: HMAC result: ' + macOutput.data); 5659 console.info('[Sync]: MAC len: ' + mac.getMacLength()); 5660} 5661``` 5662 5663### getMacLength 5664 5665getMacLength(): number 5666 5667获取Mac消息认证码的长度(字节数)。 5668 5669**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5670 5671**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5672 5673API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5674 5675**返回值:** 5676 5677| 类型 | 说明 | 5678| ------ | --------------------------- | 5679| number | 返回mac计算结果的字节长度。 | 5680 5681**错误码:** 5682以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5683 5684| 错误码ID | 错误信息 | 5685| -------- | ---------------------- | 5686| 17630001 | crypto operation error. | 5687 5688**示例:** 5689 5690<!--code_no_check--> 5691```ts 5692import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5693import { BusinessError } from '@kit.BasicServicesKit'; 5694 5695let mac = cryptoFramework.createMac('SHA256'); 5696console.info('Mac algName is: ' + mac.algName); 5697let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]); 5698let keyBlob: cryptoFramework.DataBlob = { data: keyData }; 5699let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 5700let promiseConvertKey = symKeyGenerator.convertKey(keyBlob); 5701promiseConvertKey.then(symKey => { 5702 let promiseMacInit = mac.init(symKey); 5703 return promiseMacInit; 5704}).then(() => { 5705 let blob: cryptoFramework.DataBlob = { data : new Uint8Array([83])}; 5706 let promiseMacUpdate = mac.update(blob); 5707 return promiseMacUpdate; 5708}).then(() => { 5709 let promiseMacDoFinal = mac.doFinal(); 5710 return promiseMacDoFinal; 5711}).then(macOutput => { 5712 console.info('[Promise]: HMAC result: ' + macOutput.data); 5713 let macLen = mac.getMacLength(); 5714 console.info('MAC len: ' + macLen); 5715}).catch((error: BusinessError) => { 5716 console.error("[Promise]: error: " + error.message); 5717}); 5718``` 5719 5720## cryptoFramework.createRandom 5721 5722createRandom(): Random 5723 5724生成Random实例,用于进行随机数的计算与设置种子。 5725 5726支持的规格详见框架概述[随机数算法规格](../../security/CryptoArchitectureKit/crypto-generate-random-number.md#支持的算法与规格)。 5727 5728**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5729 5730**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5731 5732API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5733 5734**返回值**: 5735 5736| 类型 | 说明 | 5737| ------ | ----------------------------------------------- | 5738| Random | 返回由输入算法指定生成的[Random](#random)对象。 | 5739 5740**错误码:** 5741以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5742 5743| 错误码ID | 错误信息 | 5744| -------- | ------------ | 5745| 17620001 | memory error. | 5746 5747**示例:** 5748 5749```ts 5750import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5751import { BusinessError } from '@kit.BasicServicesKit'; 5752 5753try { 5754 let rand = cryptoFramework.createRandom(); 5755} catch (error) { 5756 let e: BusinessError = error as BusinessError; 5757 console.error(`sync error, ${e.code}, ${e.message}`); 5758} 5759``` 5760 5761## Random 5762 5763Random类,调用Random方法可以进行随机数计算。调用前,需要通过[createRandom](#cryptoframeworkcreaterandom)构造Random实例。 5764 5765### 属性 5766 5767**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5768 5769**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5770 5771API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5772 5773| 名称 | 类型 | 可读 | 可写 | 说明 | 5774| ------- | ------ | ---- | ---- | -------------------- | 5775| algName<sup>10+</sup> | string | 是 | 否 | 代表当前使用的随机数生成算法,目前只支持“CTR_DRBG"。 | 5776 5777### generateRandom 5778 5779generateRandom(len: number, callback: AsyncCallback\<DataBlob>): void 5780 5781异步生成指定长度的随机数,通过注册回调函数返回。 5782 5783> **说明:** 5784> 5785> 该接口不支持轻量级智能穿戴。 5786 5787**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5788 5789**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5790 5791API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5792 5793**参数:** 5794 5795| 参数名 | 类型 | 必填 | 说明 | 5796| -------- | ------------------------ | ---- | -------------------- | 5797| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 5798| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 5799 5800**错误码:** 5801以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5802 5803| 错误码ID | 错误信息 | 5804| -------- | ---------------------- | 5805| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5806| 17620001 | memory error. | 5807| 17630001 | crypto operation error. | 5808 5809**示例:** 5810 5811```ts 5812import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5813 5814let rand = cryptoFramework.createRandom(); 5815rand.generateRandom(12, (err, randData) => { 5816 if (err) { 5817 console.error("[Callback] err: " + err.code); 5818 } else { 5819 console.info('[Callback]: generate random result: ' + randData.data); 5820 } 5821}); 5822``` 5823 5824### generateRandom 5825 5826generateRandom(len: number): Promise\<DataBlob> 5827 5828异步生成指定长度的随机数,通过Promise返回。 5829 5830> **说明:** 5831> 5832> 该接口不支持轻量级智能穿戴。 5833 5834**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5835 5836**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5837 5838API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5839 5840**参数:** 5841 5842| 参数名 | 类型 | 必填 | 说明 | 5843| ------ | ------ | ---- | ------------------------------------------------------ | 5844| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 5845 5846**返回值:** 5847 5848| 类型 | 说明 | 5849| ------------------ | ----------- | 5850| Promise\<[DataBlob](#datablob)> | Promise对象。 | 5851 5852**错误码:** 5853以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5854 5855| 错误码ID | 错误信息 | 5856| -------- | ---------------------- | 5857| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5858| 17620001 | memory error. | 5859| 17630001 | crypto operation error. | 5860 5861**示例:** 5862 5863```ts 5864import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5865import { BusinessError } from '@kit.BasicServicesKit'; 5866 5867let rand = cryptoFramework.createRandom(); 5868let promiseGenerateRand = rand.generateRandom(12); 5869promiseGenerateRand.then(randData => { 5870 console.info('[Promise]: rand result: ' + randData.data); 5871}).catch((error: BusinessError) => { 5872 console.error("[Promise]: error: " + error.message); 5873}); 5874``` 5875 5876### generateRandomSync<sup>10+</sup> 5877 5878generateRandomSync(len: number): DataBlob 5879 5880同步生成指定长度的随机数。 5881 5882**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5883 5884**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5885 5886API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5887 5888**参数:** 5889 5890| 参数名 | 类型 | 必填 | 说明 | 5891| ------ | ------ | ---- | -------------------- | 5892| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 5893 5894**返回值:** 5895 5896| 类型 | 说明 | 5897| ------------------ | ----------- | 5898|[DataBlob](#datablob) | 表示生成的随机数。 | 5899 5900**错误码:** 5901以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5902 5903| 错误码ID | 错误信息 | 5904| -------- | ---------------------- | 5905| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5906| 17620001 | memory error. | 5907| 17630001 | crypto operation error. | 5908 5909**示例:** 5910 5911```ts 5912import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5913import { BusinessError } from '@kit.BasicServicesKit'; 5914 5915let rand = cryptoFramework.createRandom(); 5916try { 5917 let randData = rand.generateRandomSync(12); 5918 if (randData != null) { 5919 console.info('[Sync]: rand result: ' + randData.data); 5920 } else { 5921 console.error("[Sync]: get rand result fail!"); 5922 } 5923} catch (error) { 5924 let e: BusinessError = error as BusinessError; 5925 console.error(`sync error, ${e.code}, ${e.message}`); 5926} 5927``` 5928 5929### setSeed 5930 5931setSeed(seed: DataBlob): void 5932 5933设置指定的种子。 5934 5935**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5936 5937**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5938 5939API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5940 5941| 参数名 | 类型 | 必填 | 说明 | 5942| ------ | -------- | ---- | ------------ | 5943| seed | [DataBlob](#datablob) | 是 | 设置的种子。 | 5944 5945**错误码:** 5946以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5947 5948| 错误码ID | 错误信息 | 5949| -------- | ----------------- | 5950| 17620001 | memory error. | 5951 5952**示例:** 5953 5954```ts 5955import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5956import { BusinessError } from '@kit.BasicServicesKit'; 5957 5958let rand = cryptoFramework.createRandom(); 5959rand.generateRandom(12, (err, randData) => { 5960 if (err) { 5961 console.error("[Callback] err: " + err.code); 5962 } else { 5963 console.info('[Callback]: generate random result: ' + randData.data); 5964 try { 5965 rand.setSeed(randData); 5966 } catch (error) { 5967 let e: BusinessError = error as BusinessError; 5968 console.error(`sync error, ${e.code}, ${e.message}`); 5969 } 5970 } 5971}); 5972``` 5973 5974## cryptoFramework.createKdf<sup>11+</sup> 5975 5976createKdf(algName: string): Kdf 5977 5978密钥派生函数(key derivation function)实例生成。<br/>支持的规格详见[密钥派生函数规格](../../security/CryptoArchitectureKit/crypto-key-derivation-overview.md)。 5979 5980**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5981 5982**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 5983 5984API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 5985 5986**参数:** 5987 5988| 参数名 | 类型 | 必填 | 说明 | 5989| ------- | ------ | ---- | --------------------------------- | 5990| algName | string | 是 | 指定密钥派生算法(包含HMAC配套的散列函数):目前支持PBKDF2、HKDF算法,如"PBKDF2\|SHA256", "HKDF\|SHA256"。 | 5991 5992**返回值**: 5993 5994| 类型 | 说明 | 5995| ------------ | ------------------------------------------ | 5996| [Kdf](#kdf11) | 返回由输入算法指定生成的Kdf对象。 | 5997 5998**错误码:** 5999以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6000 6001| 错误码ID | 错误信息 | 6002| -------- | ---------------------- | 6003| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6004| 801 | this operation is not supported. | 6005| 17620001 | memory error. | 6006 6007**示例:** 6008- PBKDF2算法 6009```ts 6010import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6011 6012let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6013``` 6014 6015## Kdf<sup>11+</sup> 6016 6017密钥派生函数(key derivation function)类,使用密钥派生方法之前需要创建该类的实例进行操作,通过createKdf(algName: string): Kdf方法构造此实例。 6018 6019### 属性 6020 6021**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6022 6023**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6024 6025API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 6026 6027| 名称 | 类型 | 可读 | 可写 | 说明 | 6028| ------- | ------ | ---- | ---- | ---------------------------- | 6029| algName | string | 是 | 否 | 密钥派生函数的算法名称。 | 6030 6031### generateSecret 6032 6033generateSecret(params: KdfSpec, callback: AsyncCallback\<DataBlob>): void 6034 6035基于传入的密钥派生参数进行密钥派生,通过注册回调函数返回派生得到的密钥。 6036 6037**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6038 6039**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6040 6041API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 6042 6043**参数:** 6044 6045| 参数名 | 类型 | 必填 | 说明 | 6046| -------- | ------------------------ | ---- | ---------------------- | 6047| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 6048| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取派生得到的密钥DataBlob数据。 | 6049 6050**错误码:** 6051以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6052 6053| 错误码ID | 错误信息 | 6054| -------- | ---------------------- | 6055| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6056| 17620001 | memory error. | 6057| 17630001 | crypto operation error. | 6058 6059**示例:** 6060 6061- PBKDF2算法 6062 ```ts 6063 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6064 6065 let spec: cryptoFramework.PBKDF2Spec = { 6066 algName: 'PBKDF2', 6067 password: '123456', 6068 salt: new Uint8Array(16), 6069 iterations: 10000, 6070 keySize: 32 6071 }; 6072 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6073 kdf.generateSecret(spec, (err, secret) => { 6074 if (err) { 6075 console.error("key derivation error."); 6076 return; 6077 } 6078 console.info('key derivation output is ' + secret.data); 6079 }); 6080 ``` 6081 6082- HKDF算法 6083 ```ts 6084 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6085 6086 let spec: cryptoFramework.HKDFSpec = { 6087 algName: 'HKDF', 6088 key: '123456', 6089 salt: new Uint8Array(16), 6090 info: new Uint8Array(16), 6091 keySize: 32 6092 }; 6093 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 6094 kdf.generateSecret(spec, (err, secret) => { 6095 if (err) { 6096 console.error("key derivation error."); 6097 return; 6098 } 6099 console.info('key derivation output is ' + secret.data); 6100 }); 6101 ``` 6102 6103### generateSecret 6104 6105generateSecret(params: KdfSpec): Promise\<DataBlob> 6106 6107基于传入的密钥派生参数进行密钥派生,通过Promise形式返回派生得到的密钥。 6108 6109**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6110 6111**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6112 6113API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 6114 6115**参数:** 6116 6117| 参数名 | 类型 | 必填 | 说明 | 6118| ------ | ------ | ---- | ---------------------- | 6119| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 6120 6121**返回值:** 6122 6123| 类型 | 说明 | 6124| ------------------ | -------- | 6125| Promise\<[DataBlob](#datablob)> | 回调函数,用于获取派生得到的密钥DataBlob数据。 | 6126 6127**错误码:** 6128以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6129 6130| 错误码ID | 错误信息 | 6131| -------- | ---------------------- | 6132| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6133| 17620001 | memory error. | 6134| 17630001 | crypto operation error. | 6135 6136**示例:** 6137 6138- PBKDF2算法 6139 ```ts 6140 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6141 import { BusinessError } from '@kit.BasicServicesKit'; 6142 6143 let spec: cryptoFramework.PBKDF2Spec = { 6144 algName: 'PBKDF2', 6145 password: '123456', 6146 salt: new Uint8Array(16), 6147 iterations: 10000, 6148 keySize: 32 6149 }; 6150 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6151 let kdfPromise = kdf.generateSecret(spec); 6152 kdfPromise.then(secret => { 6153 console.info('key derivation output is ' + secret.data); 6154 }).catch((error: BusinessError) => { 6155 console.error("key derivation error, " + error.message); 6156 }); 6157 ``` 6158 6159- HKDF算法 6160 ```ts 6161 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6162 import { BusinessError } from '@kit.BasicServicesKit'; 6163 6164 let spec: cryptoFramework.HKDFSpec = { 6165 algName: 'HKDF', 6166 key: '123456', 6167 salt: new Uint8Array(16), 6168 info: new Uint8Array(16), 6169 keySize: 32 6170 }; 6171 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 6172 let kdfPromise = kdf.generateSecret(spec); 6173 kdfPromise.then(secret => { 6174 console.info('key derivation output is ' + secret.data); 6175 }).catch((error: BusinessError) => { 6176 console.error("key derivation error, " + error.message); 6177 }); 6178 ``` 6179 6180### generateSecretSync<sup>12+</sup> 6181 6182generateSecretSync(params: KdfSpec): DataBlob 6183 6184基于传入的密钥派生参数进行密钥派生,通过同步方式返回派生得到的密钥。 6185 6186**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6187 6188**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6189 6190**参数:** 6191 6192| 参数名 | 类型 | 必填 | 说明 | 6193| ------ | ------ | ---- | ---------------------- | 6194| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 6195 6196**返回值:** 6197 6198| 类型 | 说明 | 6199| ------------------ | -------- | 6200| [DataBlob](#datablob) | 用于获取派生得到的密钥DataBlob数据。 | 6201 6202**错误码:** 6203以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6204 6205| 错误码ID | 错误信息 | 6206| -------- | ---------------------- | 6207| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 6208| 17620001 | memory error. | 6209| 17620002 | runtime error. | 6210| 17630001 | crypto operation error. | 6211 6212**示例:** 6213 6214- PBKDF2算法 6215 ```ts 6216 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6217 6218 let spec: cryptoFramework.PBKDF2Spec = { 6219 algName: 'PBKDF2', 6220 password: '123456', 6221 salt: new Uint8Array(16), 6222 iterations: 10000, 6223 keySize: 32 6224 }; 6225 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6226 let secret = kdf.generateSecretSync(spec); 6227 console.info("[Sync]key derivation output is " + secret.data); 6228 ``` 6229 6230- HKDF算法 6231 ```ts 6232 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6233 6234 let spec: cryptoFramework.HKDFSpec = { 6235 algName: 'HKDF', 6236 key: '123456', 6237 salt: new Uint8Array(16), 6238 info: new Uint8Array(16), 6239 keySize: 32 6240 }; 6241 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 6242 let secret = kdf.generateSecretSync(spec); 6243 console.info("[Sync]key derivation output is " + secret.data); 6244 ```