1# @ohos.security.cryptoFramework (加解密算法库框架) 2 3为屏蔽底层硬件和算法库,向上提供统一的密码算法库加解密相关接口。 4 5> **说明:** 6> 7> - 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 8 9## 导入模块 10 11```ts 12import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 13``` 14 15## Result 16 17 表示执行结果的枚举。 18 19 **系统能力:** SystemCapability.Security.CryptoFramework 20 21| 名称 | 值 | 说明 | 22| ------------------------------------- | -------- | ---------------------------- | 23| INVALID_PARAMS | 401 | 非法入参。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 24| NOT_SUPPORT | 801 | 操作不支持。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 | 25| ERR_OUT_OF_MEMORY | 17620001 | 内存错误。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 26| ERR_RUNTIME_ERROR | 17620002 | 运行时外部错误。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 | 27| ERR_CRYPTO_OPERATION | 17630001 | 调用三方算法库API出错。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 28 29## DataBlob 30 31buffer数组,提供blob数据类型。 32 33 **原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 34 35 **系统能力:** SystemCapability.Security.CryptoFramework 36 37| 名称 | 类型 | 可读 | 可写 | 说明 | 38| ---- | ---------- | ---- | ---- | ------ | 39| data | Uint8Array | 是 | 是 | 数据。 | 40 41> **说明:** 42> 43> Uint8Array类型数据表示8位无符号整数的数组。 44 45## ParamsSpec 46 47加解密参数,在进行对称加解密时需要构造其子类对象,并将子类对象传入[init()](#init-2)方法。 48 49适用于需要iv等参数的对称加解密模式(对于无iv等参数的模式如ECB模式,无需构造,在[init()](#init-2)中传入null即可)。 50 51**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 52 53**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 54 55API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 56 57| 名称 | 类型 | 可读 | 可写 | 说明 | 58| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 59| algName | string | 是 | 是 | 指明对称加解密参数的算法模式。可选值如下:<br/> - "IvParamsSpec": 适用于CBC\|CTR\|OFB\|CFB模式<br/> - "GcmParamsSpec": 适用于GCM模式<br/> - "CcmParamsSpec": 适用于CCM模式 | 60 61> **说明:** 62> 63> 由于[init()](#init-2)的params参数是ParamsSpec类型(父类),而实际需要传入具体的子类对象(如IvParamsSpec),因此在构造子类对象时应设置其父类ParamsSpec的algName参数,使算法库在init()时知道传入的是哪种子类对象。 64 65## IvParamsSpec 66 67加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。 68 69适用于CBC、CTR、OFB、CFB这些仅使用iv作为参数的加解密模式。 70 71**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 72 73**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 74 75API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 76 77| 名称 | 类型 | 可读 | 可写 | 说明 | 78| ---- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 79| iv | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数iv。常见取值如下:<br/>- AES的CBC\|CTR\|OFB\|CFB模式:iv长度为16字节<br/>- 3DES的CBC\|OFB\|CFB模式:iv长度为8字节<br/>- SM4<sup>10+</sup>的CBC\|CTR\|OFB\|CFB模式:iv长度为16字节。 | 80 81> **说明:** 82> 83> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 84 85## GcmParamsSpec 86 87加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。 88 89适用于GCM模式。 90 91**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 92 93**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 94 95API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 96 97| 名称 | 类型 | 可读 | 可写 | 说明 | 98| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 99| iv | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数iv,长度为1~16字节,常用为12字节。 | 100| aad | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数aad,长度为0~INT_MAX字节,常用为16字节。 | 101| authTag | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数authTag,长度为16字节。<br/>采用GCM模式加密时,需要获取[doFinal()](#dofinal-2)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob),取出其末尾16字节作为解密时[init()](#init-2)或[initSync()](#initsync12)方法的入参GcmParamsSpec中的的authTag。 | 102 103> **说明:** 104> 105> 1. 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 106> 2. 对于在1~16字节长度范围内的iv,加解密算法库不作额外限制,但其结果取决于底层openssl是否支持。 107> 3. 用户不需要使用aad参数或aad长度为0时,可以指定aad的data属性为空的Uint8Array,来构造GcmParamsSpec,写法为aad: { data: new Uint8Array() }。 108 109## CcmParamsSpec 110 111加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。 112 113适用于CCM模式。 114 115**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 116 117**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 118 119API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 120 121| 名称 | 类型 | 可读 | 可写 | 说明 | 122| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 123| iv | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数iv,长度为7字节。 | 124| aad | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数aad,长度为8字节。 | 125| authTag | [DataBlob](#datablob) | 是 | 是 | 指明加解密参数authTag,长度为12字节。<br/>采用CCM模式加密时,需要获取[doFinal()](#dofinal-2)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob),取出其末尾12字节作为解密时[init()](#init-2)或[initSync()](#initsync12)方法的入参[CcmParamsSpec](#ccmparamsspec)中的authTag。 | 126 127> **说明:** 128> 129> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 130 131## CryptoMode 132 133表示加解密操作的枚举。 134 135**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 136 137**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 138 139API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 140 141| 名称 | 值 | 说明 | 142| ------------ | ---- | ------------------ | 143| ENCRYPT_MODE | 0 | 表示进行加密操作。 | 144| DECRYPT_MODE | 1 | 表示进行解密操作。 | 145 146## AsyKeySpecItem<sup>10+</sup> 147 148表示密钥参数的枚举。 149 150**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 151 152**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 153 154API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 155 156| 名称 | 值 | 说明 | 157| ------------ | ---- | ---------------- | 158| DSA_P_BN | 101 | DSA算法的素模数p。 | 159| DSA_Q_BN | 102 | DSA算法中密钥参数q(p-1的素因子)。 | 160| DSA_G_BN | 103 | DSA算法的参数g。 | 161| DSA_SK_BN | 104 | DSA算法的私钥sk。 | 162| DSA_PK_BN | 105 | DSA算法的公钥pk。 | 163| ECC_FP_P_BN | 201 | ECC算法中表示椭圆曲线Fp域的素数p。 | 164| ECC_A_BN | 202 | ECC算法中椭圆曲线的第一个系数a。 | 165| ECC_B_BN | 203 | ECC算法中椭圆曲线的第二个系数b。 | 166| ECC_G_X_BN | 204 | ECC算法中基点g的x坐标。 | 167| ECC_G_Y_BN | 205 | ECC算法中基点g的y坐标。 | 168| ECC_N_BN | 206 | ECC算法中基点g的阶n。 | 169| ECC_H_NUM | 207 | ECC算法中的余因子h。 | 170| ECC_SK_BN | 208 | ECC算法中的私钥sk。 | 171| ECC_PK_X_BN | 209 | ECC算法中,公钥pk(椭圆曲线上的一个点)的x坐标。 | 172| ECC_PK_Y_BN | 210 | ECC算法中,公钥pk(椭圆曲线上的一个点)的y坐标。 | 173| ECC_FIELD_TYPE_STR | 211 | ECC算法中,椭圆曲线的域类型(当前只支持Fp域)。 | 174| ECC_FIELD_SIZE_NUM | 212 | ECC算法中域的大小,单位为bits(注:对于Fp域,域的大小为素数p的bits长度)。 | 175| ECC_CURVE_NAME_STR | 213 | ECC算法中的SECG(Standards for Efficient Cryptography Group)曲线名称。 | 176| RSA_N_BN | 301 | RSA算法中的模数n。 | 177| RSA_SK_BN | 302 | RSA算法中的私钥sk(即私钥指数d)。 | 178| RSA_PK_BN | 303 | RSA算法中的公钥pk(即公钥指数e)。 | 179| DH_P_BN<sup>11+</sup> | 401 | DH算法中的素数p。 | 180| DH_G_BN<sup>11+</sup> | 402 | DH算法中的参数g。 | 181| DH_L_NUM<sup>11+</sup> | 403 | DH算法中私钥长度,单位为bit。 | 182| DH_SK_BN<sup>11+</sup> | 404 | DH算法中的私钥sk。 | 183| DH_PK_BN<sup>11+</sup> | 405 | DH算法中的公钥pk。 | 184| ED25519_SK_BN<sup>11+</sup> | 501 | ED25519算法中的私钥sk。 | 185| ED25519_PK_BN<sup>11+</sup> | 502 | ED25519算法中的公钥pk。 | 186| X25519_SK_BN<sup>11+</sup> | 601 | X25519算法中的私钥sk。 | 187| X25519_PK_BN<sup>11+</sup> | 602 | X25519算法中的公钥pk。 | 188 189## AsyKeySpecType<sup>10+</sup> 190 191表示密钥参数类型的枚举。 192 193**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 194 195**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 196 197API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 198 199| 名称 | 值 | 说明 | 200| ------------ | ---- | ---------------- | 201| COMMON_PARAMS_SPEC | 0 | 表示公私钥中包含的公共参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair-2)随机生成密钥对。 | 202| PRIVATE_KEY_SPEC | 1 | 表示私钥中包含的参数。使用此类型的参数可以调用[generatePriKey](#generateprikey)生成指定的私钥。 | 203| PUBLIC_KEY_SPEC | 2 | 表示公钥中包含的参数。使用此类型的参数可以调用[generatePubKey](#generatepubkey)生成指定的公钥。 | 204| KEY_PAIR_SPEC | 3 | 表示公私钥中包含的全量参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair-2)生成指定的密钥对。 | 205 206## CipherSpecItem<sup>10+</sup> 207 208表示加解密参数的枚举,这些加解密参数支持通过[setCipherSpec](#setcipherspec10)接口设置/通过[getCipherSpec](#getcipherspec10)接口获取。 209 210当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_MD_NAME_STR参数的支持,详细规格请参考[加解密规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md) 211 212**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 213 214**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 215 216API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 217 218| 名称 | 值 | 说明 | 219| ------------ | ---- | ---------------- | 220| OAEP_MD_NAME_STR | 100 | 表示RSA算法中,使用PKCS1_OAEP模式时,消息摘要功能的算法名。 | 221| OAEP_MGF_NAME_STR | 101 | 表示RSA算法中,使用PKCS1_OAEP模式时,掩码生成算法(目前仅支持MGF1)。 | 222| OAEP_MGF1_MD_STR | 102 | 表示RSA算法中,使用PKCS1_OAEP模式时,MGF1掩码生成功能的消息摘要算法。 | 223| OAEP_MGF1_PSRC_UINT8ARR | 103 | 表示RSA算法中,使用PKCS1_OAEP模式时,pSource的字节流。 | 224| SM2_MD_NAME_STR<sup>11+</sup> | 104 | 表示SM2算法中,使用的摘要算法名。 | 225 226## SignSpecItem<sup>10+</sup> 227 228表示签名验签参数的枚举,这些签名验签参数支持通过[setSignSpec](#setsignspec10)、[setVerifySpec](#setverifyspec10)接口设置/通过[getSignSpec](#getsignspec10)、[getVerifySpec](#getverifyspec10)接口获取。 229 230当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_USER_ID_UINT8ARR参数的支持,详细规格请参考[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md) 231 232**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 233 234**系统能力:** SystemCapability.Security.CryptoFramework.Signature 235 236API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 237 238| 名称 | 值 | 说明 | 239| ------------ | ---- | ---------------- | 240| PSS_MD_NAME_STR | 100 | 表示RSA算法中,使用PSS模式时,消息摘要功能的算法名。 | 241| PSS_MGF_NAME_STR | 101 | 表示RSA算法中,使用PSS模式时,掩码生成算法(目前仅支持MGF1)。 | 242| PSS_MGF1_MD_STR | 102 | 表示RSA算法中,使用PSS模式时,MGF1掩码生成功能的消息摘要参数。 | 243| PSS_SALT_LEN_NUM | 103 | 表示RSA算法中,使用PSS模式时,盐值的长度,长度以字节为单位。 | 244| PSS_TRAILER_FIELD_NUM | 104 | 表示RSA算法中,使用PSS模式时,用于编码操作的整数。 | 245| SM2_USER_ID_UINT8ARR<sup>11+</sup> | 105 | 表示SM2算法中,用户身份标识字段。 | 246 247## AsyKeySpec<sup>10+</sup> 248 249指定非对称密钥参数的基本接口,用于创建密钥生成器。在指定非对称密钥参数时需要构造其子类对象,并将子类对象传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。构造子类对象时,除了RSA密钥采用小端写法外,其他bigint类型的密钥参数均采用大端写法,并使用正数。 250 251**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 252 253**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 254 255API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 256 257| 名称 | 类型 | 可读 | 可写 | 说明 | 258| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 259| algName | string | 是 | 是 | 指定非对称密钥的算法名称,比如"RSA"、"DSA"、"ECC"、"SM2"、"Ed25519"、"X25519"、"DH"。 | 260| specType | [AsyKeySpecType](#asykeyspectype10) | 是 | 是 | 指定密钥参数类型,用于区分公/私钥参数。 | 261 262## DSACommonParamsSpec<sup>10+</sup> 263 264密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的公共参数,随机生成公/私钥。 265 266在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 267 268**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 269 270**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 271 272API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 273 274| 名称 | 类型 | 可读 | 可写 | 说明 | 275| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 276| p | bigint | 是 | 是 | 指定DSA算法的素模数p。 | 277| q | bigint | 是 | 是 | 指定DSA算法中密钥参数q(p-1的素因子)。 | 278| g | bigint | 是 | 是 | 指定DSA算法的参数g。 | 279 280## DSAPubKeySpec<sup>10+</sup> 281 282密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公钥包含的参数。 283 284在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 285 286**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 287 288**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 289 290API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 291 292| 名称 | 类型 | 可读 | 可写 | 说明 | 293| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 294| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 是 | 是 | 指定DSA算法中公私钥都包含的公共参数。 | 295| pk | bigint | 是 | 是 | 指定DSA算法的公钥。 | 296 297## DSAKeyPairSpec<sup>10+</sup> 298 299密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的全量参数。 300 301在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 302 303**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 304 305**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 306 307API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 308 309| 名称 | 类型 | 可读 | 可写 | 说明 | 310| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 311| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 是 | 是 | 指定DSA算法中公私钥都包含的公共参数。 | 312| sk | bigint | 是 | 是 | 指定DSA算法的私钥sk。 | 313| pk | bigint | 是 | 是 | 指定DSA算法的公钥pk。 | 314 315## ECField<sup>10+</sup> 316 317指定椭圆曲线的域。当前只支持Fp域。 318 319**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 320 321**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 322 323API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 324 325| 名称 | 类型 | 可读 | 可写 | 说明 | 326| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 327| fieldType | string | 是 | 是 | 指定椭圆曲线域的类型,当前只支持"Fp"。 | 328 329## ECFieldFp<sup>10+</sup> 330 331指定椭圆曲线素数域。是[ECField](#ecfield10)的子类。 332 333**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 334 335**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 336 337API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 338 339| 名称 | 类型 | 可读 | 可写 | 说明 | 340| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 341| p | bigint | 是 | 是 | 指定素数p。 | 342 343## Point<sup>10+</sup> 344 345指定椭圆曲线上的一个点。 346 347**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 348 349**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 350 351API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 352 353| 名称 | 类型 | 可读 | 可写 | 说明 | 354| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 355| x | bigint | 是 | 是 | 指定椭圆曲线上,点的x坐标。 | 356| y | bigint | 是 | 是 | 指定椭圆曲线上,点的y坐标。 | 357 358## ECCCommonParamsSpec<sup>10+</sup> 359 360密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的公共参数,随机生成公/私钥。 361 362在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 363 364**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 365 366**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 367 368API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 369 370| 名称 | 类型 | 可读 | 可写 | 说明 | 371| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 372| field | [ECField](#ecfield10) | 是 | 是 | 指定椭圆曲线的域(当前只支持Fp域)。 | 373| a | bigint | 是 | 是 | 指定椭圆曲线的第一个系数a。 | 374| b | bigint | 是 | 是 | 指定椭圆曲线的第二个系数b。 | 375| g | [Point](#point10) | 是 | 是 | 指定基点g。 | 376| n | bigint | 是 | 是 | 指定基点g的阶数n。 | 377| h | number | 是 | 是 | 指定余因子h。 | 378 379## ECCPriKeySpec<sup>10+</sup> 380 381密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中私钥包含的参数。 382 383在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 384 385**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 386 387**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 388 389API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 390 391| 名称 | 类型 | 可读 | 可写 | 说明 | 392| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 393| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是 | 是 | 指定ECC算法中公私钥都包含的公共参数。 | 394| sk | bigint | 是 | 是 | 指定ECC算法的私钥sk。 | 395 396## ECCPubKeySpec<sup>10+</sup> 397 398密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公钥包含的参数。 399 400在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 401 402**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 403 404**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 405 406API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 407 408| 名称 | 类型 | 可读 | 可写 | 说明 | 409| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 410| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是 | 是 | 指定ECC算法中公私钥都包含的公共参数。 | 411| pk | [Point](#point10) | 是 | 是 | 指定ECC算法的公钥pk。 | 412 413## ECCKeyPairSpec<sup>10+</sup> 414 415密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的全量参数。 416 417在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 418 419**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 420 421**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 422 423API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 424 425| 名称 | 类型 | 可读 | 可写 | 说明 | 426| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 427| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 是 | 是 | 指定ECC算法中公私钥都包含的公共参数。 | 428| sk | bigint | 是 | 是 | 指定ECC算法的私钥sk。 | 429| pk | [Point](#point10) | 是 | 是 | 指定ECC算法的公钥pk。 | 430 431## RSACommonParamsSpec<sup>10+</sup> 432 433密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的公共参数,随机生成公/私钥。 434 435在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 436 437**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 438 439**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 440 441API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 442 443| 名称 | 类型 | 可读 | 可写 | 说明 | 444| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 445| n | bigint | 是 | 是 | 指定模数n。 | 446 447## RSAPubKeySpec<sup>10+</sup> 448 449密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公钥包含的参数。 450 451在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 452 453**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 454 455**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 456 457API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 458 459| 名称 | 类型 | 可读 | 可写 | 说明 | 460| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 461| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 是 | 是 | 指定RSA算法中公私钥都包含的公共参数。 | 462| pk | bigint | 是 | 是 | 指定RSA算法的公钥pk。 | 463 464## RSAKeyPairSpec<sup>10+</sup> 465 466密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的全量参数。 467 468在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 469 470**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 471 472**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 473 474API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 475 476| 名称 | 类型 | 可读 | 可写 | 说明 | 477| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 478| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 是 | 是 | 指定RSA算法中公私钥都包含的公共参数。 | 479| sk | bigint | 是 | 是 | 指定RSA算法的私钥sk。 | 480| pk | bigint | 是 | 是 | 指定RSA算法的公钥pk。 | 481 482## ED25519PriKeySpec<sup>11+</sup> 483 484密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中私钥包含的参数。 485 486在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 487 488**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 489 490**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 491 492API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 493 494| 名称 | 类型 | 可读 | 可写 | 说明 | 495| ---- | ------ | ---- | ---- | ------------------------- | 496| sk | bigint | 是 | 是 | 指定ED25519算法的私钥sk。 | 497 498## ED25519PubKeySpec<sup>11+</sup> 499 500密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中公钥包含的参数。 501 502在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 503 504**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 505 506**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 507 508API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 509 510| 名称 | 类型 | 可读 | 可写 | 说明 | 511| ---- | ------ | ---- | ---- | ------------------------- | 512| pk | bigint | 是 | 是 | 指定ED25519算法的公钥pk。 | 513 514## ED25519KeyPairSpec<sup>11+</sup> 515 516密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ED25519算法中公私钥包含的全量参数。 517 518在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 519 520**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 521 522**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 523 524API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 525 526| 名称 | 类型 | 可读 | 可写 | 说明 | 527| ---- | ------ | ---- | ---- | ------------------------- | 528| sk | bigint | 是 | 是 | 指定ED25519算法的私钥sk。 | 529| pk | bigint | 是 | 是 | 指定ED25519算法的公钥pk。 | 530 531## X25519PriKeySpec<sup>11+</sup> 532 533密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中私钥包含的参数。 534 535在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 536 537**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 538 539**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 540 541API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 542 543| 名称 | 类型 | 可读 | 可写 | 说明 | 544| ---- | ------ | ---- | ---- | ------------------------ | 545| sk | bigint | 是 | 是 | 指定X25519算法的私钥sk。 | 546 547## X25519PubKeySpec<sup>11+</sup> 548 549密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公钥包含的参数。 550 551在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 552 553**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 554 555**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 556 557API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 558 559| 名称 | 类型 | 可读 | 可写 | 说明 | 560| ---- | ------ | ---- | ---- | ------------------------ | 561| pk | bigint | 是 | 是 | 指定X25519算法的公钥pk。 | 562 563## X25519KeyPairSpec<sup>11+</sup> 564 565密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公私钥包含的全量参数。 566 567在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 568 569**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 570 571**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 572 573API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 574 575| 名称 | 类型 | 可读 | 可写 | 说明 | 576| ---- | ------ | ---- | ---- | ------------------------ | 577| sk | bigint | 是 | 是 | 指定X25519算法的私钥sk。 | 578| pk | bigint | 是 | 是 | 指定X25519算法的公钥pk。 | 579 580## DHCommonParamsSpec<sup>11+</sup> 581 582密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的参数。 583 584在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 585 586**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 587 588**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 589 590API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 591 592| 名称 | 类型 | 可读 | 可写 | 说明 | 593| ---- | ------ | ---- | ---- | ----------------------------------- | 594| p | bigint | 是 | 是 | 指定DH算法中大素数p。 | 595| g | bigint | 是 | 是 | 指定DH算法中参数g。 | 596| l | number | 是 | 是 | 指定DH算法中私钥的长度,单位为bit。 | 597 598## DHPriKeySpec<sup>11+</sup> 599 600密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中私钥包含的参数。 601 602在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 603 604**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 605 606**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 607 608API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 609 610| 名称 | 类型 | 可读 | 可写 | 说明 | 611| ------ | ------------------ | ---- | ---- | ------------------------------------ | 612| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是 | 是 | 指定DH算法中公私钥都包含的公共参数。 | 613| sk | bigint | 是 | 是 | 指定DH算法的私钥sk。 | 614 615## DHPubKeySpec<sup>11+</sup> 616 617密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公钥包含的参数。 618 619在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 620 621**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 622 623**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 624 625API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 626 627| 名称 | 类型 | 可读 | 可写 | 说明 | 628| ------ | ------------------ | ---- | ---- | ------------------------------------ | 629| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是 | 是 | 指定DH算法中公私钥都包含的公共参数。 | 630| pk | bigint | 是 | 是 | 指定DH算法的公钥pk。 | 631 632## DHKeyPairSpec<sup>11+</sup> 633 634密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的全量参数。 635 636在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 637 638**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 639 640**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 641 642API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 643 644| 名称 | 类型 | 可读 | 可写 | 说明 | 645| ------ | ------------------ | ---- | ---- | ------------------------------------ | 646| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 是 | 是 | 指定DH算法中公私钥都包含的公共参数。 | 647| sk | bigint | 是 | 是 | 指定DH算法的私钥sk。 | 648| pk | bigint | 是 | 是 | 指定DH算法的公钥pk。 | 649 650## KdfSpec<sup>11+</sup> 651 652密钥派生函数参数,使用密钥派生函数进行密钥派生时,需要构建其子类对象并作为输入。 653 654**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 655 656**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 657 658API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 659 660| 名称 | 类型 | 可读 | 可写 | 说明 | 661| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 662| algName | string | 是 | 是 | 指明密钥派生函数的算法名,如"PBKDF2"。 | 663 664## PBKDF2Spec<sup>11+</sup> 665 666密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为PBKDF2密钥派生函数进行密钥派生时的输入。 667 668**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 669 670**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 671 672API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 673 674| 名称 | 类型 | 可读 | 可写 | 说明 | 675| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 676| password | string \| Uint8Array | 是 | 是 | 用户输入的原始密码。| 677| salt | Uint8Array | 是 | 是 | 盐值。 | 678| iterations | number | 是 | 是 | 迭代次数,需要为正整数。 | 679| keySize | number | 是 | 是 | 派生得到的密钥字节长度。 | 680 681> **说明:** 682> 683> password指的是原始密码,如果使用string类型,需要直接传入用于密钥派生的数据,而不是HexString、base64等字符串类型,同时需要确保该字符串为utf-8编码,否则派生结果会有差异。 684 685## HKDFSpec<sup>12+</sup> 686 687密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为HKDF密钥派生函数进行密钥派生时的输入。 688 689**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 690 691**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 692 693| 名称 | 类型 | 可读 | 可写 | 说明 | 694| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 695| key | string \| Uint8Array | 是 | 是 | 密钥材料。| 696| salt | Uint8Array | 是 | 是 | 盐值。 | 697| info | Uint8Array | 是 | 是 | 拓展信息。 | 698| keySize | number | 是 | 是 | 派生得到的密钥字节长度。 | 699 700> **说明:** 701> 702> key指的是用户输入的最初的密钥材料。info与salt是可选参数,根据模式的不同可以传空,但是不可不传。 703> 704> 例如:EXTRACT_AND_EXPAND模式需要输入全部的值,EXTRACT_ONLY模式info可以为空,在构建HKDFspec的时候,info传入null值。 705> 706> 默认的模式为EXTRACT_AND_EXPAND,"HKDF|SHA256|EXTRACT_AND_EXPAND"等价于"HKDF|SHA256"。 707 708## SM2CipherTextSpec<sup>12+</sup> 709 710SM2密文参数,使用SM2密文格式转换函数进行格式转换时,需要用到此对象。可以通过指定此参数,生成符合国密标准的ASN.1格式的SM2密文,反之,也可以从ASN.1格式的SM2密文中获取具体参数。 711 712**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 713 714**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 715 716| 名称 | 类型 | 可读 | 可写 | 说明 | 717| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 718| xCoordinate | bigint | 是 | 是 | x分量| 719| yCoordinate | bigint | 是 | 是 | y分量 | 720| cipherTextData | Uint8Array | 是 | 是 | 密文| 721| hashData | Uint8Array | 是 | 是 | 杂凑值 | 722 723> **说明:** 724> 725> 其中,hashData为使用SM3算法对明文数据运算得到的杂凑值,其长度固定为256位。cipherTextData是与明文等长的密文。 726 727## Key 728 729密钥(父类),在运行密码算法(如加解密)时需要提前生成其子类对象,并传入[Cipher](#cipher)实例的[init()](#init-2)方法。 730 731密钥可以通过密钥生成器来生成。 732 733### 属性 734 735**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 736 737**系统能力:** SystemCapability.Security.CryptoFramework.Key 738 739API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key 740 741| 名称 | 类型 | 可读 | 可写 | 说明 | 742| ------- | ------ | ---- | ---- | ---------------------------- | 743| format | string | 是 | 否 | 密钥的格式。 | 744| algName | string | 是 | 否 | 密钥对应的算法名(如果是对称密钥,则含密钥长度,否则不含密钥长度)。 | 745 746### getEncoded 747 748getEncoded(): DataBlob 749 750同步方法,获取密钥数据的字节流。密钥可以为对称密钥,公钥或者私钥。其中,公钥格式满足ASN.1语法、X.509规范、DER编码格式;私钥格式满足ASN.1语法,PKCS#8规范、DER编码方式。 751 752> **说明:** 753> 754> RSA算法使用密钥参数生成私钥时,私钥对象不支持getEncoded。 755 756**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 757 758**系统能力:** SystemCapability.Security.CryptoFramework.Key 759 760API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key 761 762**返回值:** 763 764| 类型 | 说明 | 765| --------------------- | ------------------------ | 766| [DataBlob](#datablob) | 用于查看密钥的具体内容。 | 767 768**错误码:** 769以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 770 771| 错误码ID | 错误信息 | 772| -------- | ---------------------- | 773| 801 | this operation is not supported. | 774| 17620001 | memory error. | 775| 17630001 | crypto operation error. | 776 777**示例:** 778 779```ts 780import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 781 782async function testGenerateAesKey() { 783 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256'); 784 let symKey = await symKeyGenerator.generateSymKey(); 785 let encodedKey = symKey.getEncoded(); 786 console.info('key hex:' + encodedKey.data); 787} 788``` 789 790## SymKey 791 792对称密钥,是[Key](#key)的子类,在对称加解密时需要将其对象传入[Cipher](#cipher)实例的[init()](#init-2)方法使用。 793 794对称密钥可以通过对称密钥生成器[SymKeyGenerator](#symkeygenerator)来生成。 795 796### clearMem 797 798clearMem(): void 799 800同步方法,将系统底层内存中的的密钥内容清零。建议在不再使用对称密钥实例时,调用本函数,避免内存中密钥数据存留过久。 801 802**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 803 804**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 805 806API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 807 808**示例:** 809 810<!--code_no_check--> 811```ts 812let key: cryptoFramework.SymKey; // The key is generated by a symKeyGenerator. The generation process is omitted here. 813let encodedKey = key.getEncoded(); 814console.info('key blob: '+ encodedKey.data); // Display key content. 815key.clearMem(); 816encodedKey = key.getEncoded(); 817console.info('key blob:' + encodedKey.data); // Display all 0s. 818``` 819 820## PubKey 821 822公钥,是[Key](#key)的子类,在非对称加解密、验签、密钥协商时需要将其对象作为输入使用。 823 824公钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 825 826### getAsyKeySpec<sup>10+</sup> 827 828getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number 829 830同步方法,获取密钥参数。 831 832**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 833 834**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 835 836API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 837 838**参数:** 839 840| 参数名 | 类型 | 必填 | 说明 | 841| ---- | --------------------- | ---- | -------------------- | 842| itemType | [AsyKeySpecItem](#asykeyspecitem10) | 是 | 指定的密钥参数。 | 843 844**返回值:** 845 846| 类型 | 说明 | 847| --------------------------- | --------------------------------- | 848| bigint \| string \| number | 用于查看密钥参数的具体内容。 | 849 850**错误码:** 851以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 852 853| 错误码ID | 错误信息 | 854| -------- | ---------------------- | 855| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 856| 17620001 | memory error. | 857| 17630001 | crypto operation error. | 858 859**示例:** 860 861<!--code_no_check--> 862```ts 863let key: cryptoFramework.PubKey; // key is a public key object. The generation process is omitted here. 864let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN); 865console.info('ecc item --- p: ' + p.toString(16)); 866``` 867 868### getEncodedDer<sup>12+</sup> 869 870getEncodedDer(format: string): DataBlob 871 872支持根据指定的密钥格式(如采用哪个规范、是否压缩等),获取满足ASN.1语法、DER编码的公钥数据。当前仅支持获取ECC压缩/非压缩格式的公钥数据。 873 874> **说明:** 875> 876> 本接口和[Key.getEncoded()](#getencoded)的区别是:<br/> 877> 1. 本接口可根据入参决定数据的输出格式。 878> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式,生成的数据格式与原始数据格式保持一致。(原始数据格式,指通过[convertKey](#convertkey-3)接口生成密钥对象时的数据格式)。 879 880**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 881 882**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 883 884**参数:** 885 886| 参数名 | 类型 | 必填 | 说明 | 887| ---- | --------------------- | ---- | -------------------- | 888| format | string | 是 | 用于指定当前密钥格式,取值仅支持"X509\|COMPRESSED"和"X509\|UNCOMPRESSED"。 | 889 890**返回值:** 891 892| 类型 | 说明 | 893| --------------------------- | --------------------------------- | 894| [DataBlob](#datablob) | 返回指定密钥格式的,满足ASN.1语法、DER编码的公钥数据。 | 895 896**错误码:** 897以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 898 899| 错误码ID | 错误信息 | 900| -------- | ---------------------- | 901| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 902| 17620001 | memory error. | 903| 17630001 | crypto operation error. | 904 905**示例:** 906 907<!--code_no_check--> 908```ts 909let key: cryptoFramework.PubKey; // Key is a public key object. The generation process is omitted here. 910let returnBlob = key.getEncodedDer('X509|UNCOMPRESSED'); 911console.info('returnBlob data:' + returnBlob.data); 912``` 913 914### getEncodedPem<sup>12+</sup> 915 916getEncodedPem(format: string): string 917 918同步方法,获取密钥数据的字符串。密钥可以为RSA公钥或者私钥。其中,公钥格式满足X.509规范、PKCS#1规范和PEM编码格式。 919 920**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 921 922**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 923 924**参数:** 925 926| 参数名 | 类型 | 必填 | 说明 | 927| ---- | --------------------- | ---- | -------------------- | 928| format | string | 是 | 指定的获取密钥字符串的编码格式。其中,公钥可为'PKCS1' 或'X509'格式。| 929 930**返回值:** 931 932| 类型 | 说明 | 933| --------------------------- | --------------------------------- | 934| string | 用于获取指定密钥格式的具体内容。 | 935 936**错误码:** 937以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 938 939| 错误码ID | 错误信息 | 940| -------- | ---------------------- | 941| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 942| 17620001 | memory error. | 943| 17630001 | crypto operation error. | 944 945**示例:** 946 947```ts 948import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 949 950let publicPkcs1Str1024: string = 951 "-----BEGIN RSA PUBLIC KEY-----\n" 952 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 953 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 954 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 955 + "-----END RSA PUBLIC KEY-----\n"; 956 957function TestPubKeyPkcs1ToX509BySync1024() { 958 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 959 let keyPair = rsaGenerator.convertPemKeySync(publicPkcs1Str1024, null); 960 let pubPemKey = keyPair.pubKey; 961 let pubString = pubPemKey.getEncodedPem('X509'); 962 console.info("[sync]TestPubKeyPkcs1ToX509BySync1024 pubString output is " + pubString); 963} 964``` 965 966## PriKey 967 968私钥,是[Key](#key)的子类,在非对称加解密、签名、密钥协商时需要将其作为输入使用。 969 970私钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 971 972### clearMem 973 974clearMem(): void 975 976同步方法,将系统底层内存中的的密钥内容清零。 977 978**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 979 980**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 981 982API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 983 984**示例:** 985 986<!--code_no_check--> 987```ts 988let key: cryptoFramework.PriKey; // The key is a private key generated by the asymmetric key generator. The generation process is omitted here. 989key.clearMem(); // For the asymmetric private key, clearMem() releases the internal key struct. After clearMem is executed, getEncoded() is not supported. 990``` 991 992### getAsyKeySpec<sup>10+</sup> 993 994getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number 995 996同步方法,获取密钥参数。 997 998**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 999 1000**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1001 1002API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1003 1004**参数:** 1005 1006| 参数名 | 类型 | 必填 | 说明 | 1007| ---- | --------------------- | ---- | -------------------- | 1008| itemType | [AsyKeySpecItem](#asykeyspecitem10) | 是 | 指定的密钥参数类型。 | 1009 1010**返回值:** 1011 1012| 类型 | 说明 | 1013| --------------------------- | --------------------------------- | 1014| bigint \| string \| number | 用于查看密钥参数的具体内容。 | 1015 1016**错误码:** 1017以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1018 1019| 错误码ID | 错误信息 | 1020| -------- | ---------------------- | 1021| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1022| 17620001 | memory error. | 1023| 17630001 | crypto operation error. | 1024 1025**示例:** 1026 1027<!--code_no_check--> 1028```ts 1029let key: cryptoFramework.PriKey; // key is a private key object. The generation process is omitted here. 1030let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN); 1031console.info('ecc item --- p: ' + p.toString(16)); 1032``` 1033### getEncodedDer<sup>12+</sup> 1034 1035getEncodedDer(format: string): DataBlob 1036 1037支持根据指定的密钥格式(如采用哪个规范),获取满足ASN.1语法、DER编码的私钥数据。当前仅支持获取PKCS8格式的ecc私钥数据。 1038 1039> **说明:** 1040> 1041> 本接口和[Key.getEncoded()](#getencoded)的区别是:<br/> 1042> 1. 本接口可根据入参决定数据的输出格式,当前支持获取PKCS8格式的ecc私钥数据。 1043> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式。 1044 1045**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1046 1047**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1048 1049**参数:** 1050 1051| 参数名 | 类型 | 必填 | 说明 | 1052| ---- | --------------------- | ---- | -------------------- | 1053| format | string | 是 | 用于指定当前密钥格式,取值当前仅支持"PKCS8"。 | 1054 1055**返回值:** 1056 1057| 类型 | 说明 | 1058| --------------------------- | --------------------------------- | 1059| [DataBlob](#datablob) | 返回指定密钥格式的,满足ASN.1语法、DER编码的ecc私钥数据。 | 1060 1061**错误码:** 1062以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1063 1064| 错误码ID | 错误信息 | 1065| -------- | ---------------------- | 1066| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1067| 17620001 | memory error. | 1068| 17630001 | crypto operation error. | 1069 1070**示例:** 1071 1072<!--code_no_check--> 1073```ts 1074let key: cryptoFramework.PriKey; // key is a private key object. The generation process is omitted here. 1075let returnBlob = key.getEncodedDer('PKCS8'); 1076console.info('returnBlob data:' + returnBlob.data); 1077``` 1078 1079### getEncodedPem<sup>12+</sup> 1080 1081getEncodedPem(format: string): string 1082 1083同步方法,获取密钥数据的字符串。密钥可以为RSA公钥或者私钥。其中,私钥格式满足PKCS#8规范、PKCS#1规范和PEM编码方式。 1084 1085**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1086 1087**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1088 1089**参数:** 1090 1091| 参数名 | 类型 | 必填 | 说明 | 1092| ---- | --------------------- | ---- | -------------------- | 1093| format | string | 是 | 指定的获取密钥字符串的编码格式。其中,私钥可为'PKCS1' 或'PKCS8'格式。| 1094 1095**返回值:** 1096 1097| 类型 | 说明 | 1098| --------------------------- | --------------------------------- | 1099| string | 用于获取指定密钥格式的具体内容。 | 1100 1101**错误码:** 1102以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1103 1104| 错误码ID | 错误信息 | 1105| -------- | ---------------------- | 1106| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1107| 17620001 | memory error. | 1108| 17630001 | crypto operation error. | 1109 1110**示例:** 1111 1112```ts 1113import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1114 1115let priKeyPkcs1Str1024: string = 1116 "-----BEGIN RSA PRIVATE KEY-----\n" 1117 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 1118 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 1119 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 1120 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 1121 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 1122 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 1123 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 1124 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 1125 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 1126 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 1127 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 1128 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 1129 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 1130 + "-----END RSA PRIVATE KEY-----\n"; 1131 1132function TestPriKeyPkcs1ToPkcs8BySync1024() { 1133 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 1134 let keyPair = rsaGenerator.convertPemKeySync(null, priKeyPkcs1Str1024); 1135 let priPemKey = keyPair.priKey; 1136 let priString = priPemKey.getEncodedPem('PKCS8'); 1137 console.info("[sync]TestPriKeyPkcs1ToPkcs8BySync1024 priString output is " + priString); 1138} 1139``` 1140 1141## KeyPair 1142 1143非对称密钥对,包含:公钥与私钥。 1144 1145可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 1146 1147> **说明:** 1148> 1149> KeyPair对象中的pubKey对象和priKey对象,作为KeyPair对象中的一个参数存在,当离开KeyPair对象作用域时,其内部对象可能被析构。 1150> 1151> 业务方使用时应持有KeyPair对象的引用,而非内部pubKey或priKey对象的引用。 1152 1153### 属性 1154 1155**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1156 1157**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1158 1159API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1160 1161| 名称 | 类型 | 可读 | 可写 | 说明 | 1162| ------- | ------ | ---- | ---- | ------------ | 1163| priKey | [PriKey](#prikey) | 是 | 否 | 私钥。 | 1164| pubKey | [PubKey](#pubkey) | 是 | 否 | 公钥。 | 1165 1166## cryptoFramework.createSymKeyGenerator 1167 1168createSymKeyGenerator(algName: string): SymKeyGenerator 1169 1170通过指定算法名称的字符串,获取相应的对称密钥生成器实例。 1171 1172支持的规格详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)。 1173 1174**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1175 1176**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1177 1178API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1179 1180**参数:** 1181 1182| 参数名 | 类型 | 必填 | 说明 | 1183| ------- | ------ | ---- | ------------------------------------------------------------ | 1184| algName | string | 是 | 待生成对称密钥生成器的算法名称。<br/>具体取值详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)一节中的“字符串参数”。 | 1185 1186**返回值:** 1187 1188| 类型 | 说明 | 1189| ----------------------------------- | -------------------------- | 1190| [SymKeyGenerator](#symkeygenerator) | 返回对称密钥生成器的对象。 | 1191 1192**错误码:** 1193 1194以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1195| 错误码ID | 错误信息 | 1196| -------- | ---------------------- | 1197| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1198| 801 | this operation is not supported. | 1199 1200**示例:** 1201 1202```ts 1203import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1204 1205let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1206``` 1207 1208## SymKeyGenerator 1209 1210对称密钥生成器。 1211 1212在使用该类的方法前,需要先使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)方法构建一个SymKeyGenerator实例。 1213 1214### 属性 1215 1216**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1217 1218**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1219 1220API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1221 1222| 名称 | 类型 | 可读 | 可写 | 说明 | 1223| ------- | ------ | ---- | ---- | ------------------------------ | 1224| algName | string | 是 | 否 | 对称密钥生成器指定的算法名称。 | 1225 1226### generateSymKey 1227 1228generateSymKey(callback: AsyncCallback\<SymKey>): void 1229 1230异步获取对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。 1231 1232必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1233 1234目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1235 1236> **说明:** 1237> 1238> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如指定“HMAC|SHA256”会随机生成256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKey](#convertkey)方式生成对称密钥数据。 1239 1240**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1241 1242**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1243 1244API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1245 1246**参数:** 1247 1248| 参数名 | 类型 | 必填 | 说明 | 1249| -------- | --------------------------------- | ---- | ------------------------------------------------------------ | 1250| callback | AsyncCallback\<[SymKey](#symkey)> | 是 | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 | 1251 1252**错误码:** 1253以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1254 1255| 错误码ID | 错误信息 | 1256| -------- | ------------- | 1257| 17620001 | memory error. | 1258 1259**示例:** 1260 1261```ts 1262import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1263 1264let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1265 symKeyGenerator.generateSymKey((err, symKey) => { 1266 console.info('Generate symKey success, algName:' + symKey.algName); 1267 }); 1268``` 1269 1270### generateSymKey 1271 1272generateSymKey(): Promise\<SymKey> 1273 1274异步获取该对称密钥生成器随机生成的密钥,通过Promise获取结果。 1275 1276必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1277 1278目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1279 1280**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1281 1282**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1283 1284API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1285 1286**返回值:** 1287 1288| 类型 | 说明 | 1289| --------------------------- | --------------------------------- | 1290| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 | 1291 1292**错误码:** 1293以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1294 1295| 错误码ID | 错误信息 | 1296| -------- | ------------- | 1297| 17620001 | memory error. | 1298 1299**示例:** 1300 1301```ts 1302import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1303import { BusinessError } from '@kit.BasicServicesKit'; 1304 1305let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 1306 symKeyGenerator.generateSymKey() 1307 .then(symKey => { 1308 console.info('Generate symKey success, algName: ' + symKey.algName); 1309 }).catch((error: BusinessError) => { 1310 console.error(`Generate symKey failed, ${error.code}, ${error.message}`); 1311 }); 1312``` 1313 1314### generateSymKeySync<sup>12+</sup> 1315 1316generateSymKeySync(): SymKey 1317 1318同步获取对称密钥生成器随机生成的密钥。 1319 1320必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1321 1322目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1323 1324> **说明:** 1325> 1326> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如指定“HMAC|SHA256”会随机生成256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKeySync](#convertkeysync12)方式生成对称密钥数据。 1327 1328**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1329 1330**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1331 1332**错误码:** 1333以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1334 1335| 错误码ID | 错误信息 | 1336| -------- | ------------- | 1337| 17620001 | memory error. | 1338 1339**示例:** 1340 1341```ts 1342import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1343 1344function testGenerateSymKeySync() { 1345 // 创建SymKeyGenerator实例 1346 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256'); 1347 // 使用密钥生成器随机生成对称密钥 1348 let key = symKeyGenerator.generateSymKeySync(); 1349 let encodedKey = key.getEncoded(); 1350 console.info('key hex:' + encodedKey.data); 1351} 1352``` 1353 1354### convertKey 1355 1356convertKey(key: DataBlob, callback: AsyncCallback\<SymKey>): void 1357 1358异步根据指定数据生成对称密钥,通过注册回调函数获取结果。 1359 1360必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1361 1362> **说明:** 1363> 1364> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如传入SHA256对应256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据。 1365 1366**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1367 1368**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1369 1370API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1371 1372**参数:** 1373 1374| 参数名 | 类型 | 必填 | 说明 | 1375| -------- | ------------------- | ---- | ---------------------| 1376| key | [DataBlob](#datablob) | 是 | 指定的对称密钥材料。 | 1377| callback | AsyncCallback\<[SymKey](#symkey)> | 是 | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 | 1378 1379**错误码:** 1380以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1381 1382| 错误码ID | 错误信息 | 1383| -------- | --------------------------------------------------- | 1384| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1385| 17620001 | memory error. | 1386 1387**示例:** 1388 1389```ts 1390import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1391 1392function genKeyMaterialBlob(): cryptoFramework.DataBlob { 1393 let arr = [ 1394 0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56, 1395 0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c, 1396 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes) 1397 let keyMaterial = new Uint8Array(arr); 1398 return { data: keyMaterial }; 1399} 1400 1401function testConvertKey() { 1402 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1403 let keyMaterialBlob = genKeyMaterialBlob(); 1404 symKeyGenerator.convertKey(keyMaterialBlob, (err, symKey) => { 1405 console.info('Convert symKey success, algName: ' + symKey.algName); 1406 }); 1407} 1408``` 1409 1410### convertKey 1411 1412convertKey(key: DataBlob): Promise\<SymKey> 1413 1414异步根据指定数据生成对称密钥,通过Promise获取结果。 1415 1416必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1417 1418**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1419 1420**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1421 1422API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.SymKey 1423 1424**参数:** 1425 1426| 参数名 | 类型 | 必填 | 说明 | 1427| ---- | --------------------- | ---- | -------------------- | 1428| key | [DataBlob](#datablob) | 是 | 指定的密钥材料数据。 | 1429 1430**返回值:** 1431 1432| 类型 | 说明 | 1433| --------------------------- | --------------------------------- | 1434| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 | 1435 1436**错误码:** 1437以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1438 1439| 错误码ID | 错误信息 | 1440| -------- | --------------------------------------------- | 1441| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1442| 17620001 | memory error. | 1443 1444**示例:** 1445 1446```ts 1447import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1448import { BusinessError } from '@kit.BasicServicesKit'; 1449 1450function genKeyMaterialBlob(): cryptoFramework.DataBlob { 1451 let arr = [ 1452 0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56, 1453 0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c, 1454 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes) 1455 let keyMaterial = new Uint8Array(arr); 1456 return { data: keyMaterial }; 1457} 1458 1459function testConvertKey() { 1460 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1461 let keyMaterialBlob = genKeyMaterialBlob(); 1462 symKeyGenerator.convertKey(keyMaterialBlob) 1463 .then(symKey => { 1464 console.info('Convert symKey success, algName:' + symKey.algName); 1465 }).catch((error: BusinessError) => { 1466 console.error(`Convert symKey failed, ${error.code}, ${error.message}`); 1467 }); 1468} 1469``` 1470 1471### convertKeySync<sup>12+</sup> 1472 1473convertKeySync(key: DataBlob): SymKey 1474 1475同步根据指定数据生成对称密钥。 1476 1477必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1478 1479> **说明:** 1480> 1481> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如传入SHA256对应256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据。 1482 1483**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1484 1485**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1486 1487**参数:** 1488 1489| 参数名 | 类型 | 必填 | 说明 | 1490| -------- | ------------------- | ---- | ---------------------| 1491| key | [DataBlob](#datablob) | 是 | 指定的对称密钥材料。 | 1492 1493**错误码:** 1494以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1495 1496| 错误码ID | 错误信息 | 1497| -------- | --------------------------------------------------- | 1498| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1499| 17620001 | memory error. | 1500 1501**示例:** 1502 1503```ts 1504import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1505import { buffer } from '@kit.ArkTS'; 1506 1507function testConvertKeySync() { 1508 // 对称密钥长度为64字节,512比特 1509 let keyMessage = '87654321abcdefgh87654321abcdefgh87654321abcdefgh87654321abcdefgh'; 1510 let keyBlob: cryptoFramework.DataBlob = { 1511 data : new Uint8Array(buffer.from(keyMessage, 'utf-8').buffer) 1512 } 1513 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC'); 1514 let key = symKeyGenerator.convertKeySync(keyBlob); 1515 let encodedKey = key.getEncoded(); 1516 console.info('key encoded data:' + encodedKey.data); 1517} 1518``` 1519 1520## cryptoFramework.createAsyKeyGenerator 1521 1522createAsyKeyGenerator(algName: string): AsyKeyGenerator 1523 1524通过指定算法名称的字符串,获取相应的非对称密钥生成器实例。 1525 1526支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。 1527 1528**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1529 1530**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1531 1532API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1533 1534**参数:** 1535 1536| 参数名 | 类型 | 必填 | 说明 | 1537| ------- | ------ | ---- | -------------------------------- | 1538| algName | string | 是 | 待生成对称密钥生成器的算法名称。 | 1539 1540**返回值:** 1541 1542| 类型 | 说明 | 1543| --------------- | ---------------------------- | 1544| [AsyKeyGenerator](#asykeygenerator) | 返回非对称密钥生成器的对象。 | 1545 1546**错误码:** 1547以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1548 1549| 错误码ID | 错误信息 | 1550| -------- | ---------------------- | 1551| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1552| 801 | this operation is not supported. | 1553| 17620001 | memory error. | 1554 1555**示例:** 1556 1557```ts 1558import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1559 1560let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1561``` 1562 1563## AsyKeyGenerator 1564 1565非对称密钥生成器。在使用该类的方法前,需要先使用createAsyKeyGenerator()方法构建一个AsyKeyGenerator实例。 1566 1567### 属性 1568 1569**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1570 1571**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1572 1573API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1574 1575| 名称 | 类型 | 可读 | 可写 | 说明 | 1576| ------- | ------ | ---- | ---- | -------------------------------- | 1577| algName | string | 是 | 否 | 非对称密钥生成器指定的算法名称。 | 1578 1579### generateKeyPair 1580 1581generateKeyPair(callback: AsyncCallback\<KeyPair>): void 1582 1583异步获取非对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。 1584 1585**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1586 1587**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1588 1589API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1590 1591**参数:** 1592 1593| 参数名 | 类型 | 必填 | 说明 | 1594| -------- | ----------------------- | ---- | ------------------------------ | 1595| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 1596 1597**错误码:** 1598以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1599 1600| 错误码ID | 错误信息 | 1601| -------- | ---------------------- | 1602| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types;| 1603| 17620001 | memory error. | 1604| 17630001 | crypto operation error. | 1605 1606**示例:** 1607 1608```ts 1609import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1610 1611let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1612asyKeyGenerator.generateKeyPair((err, keyPair) => { 1613 if (err) { 1614 console.error("generateKeyPair: error."); 1615 return; 1616 } 1617 console.info('generateKeyPair: success.'); 1618}) 1619``` 1620 1621### generateKeyPair 1622 1623generateKeyPair(): Promise\<KeyPair> 1624 1625异步获取该非对称密钥生成器随机生成的密钥,通过Promise获取结果。 1626 1627**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1628 1629**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1630 1631API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1632 1633**返回值:** 1634 1635| 类型 | 说明 | 1636| ----------------- | --------------------------------- | 1637| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 1638 1639**错误码:** 1640以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1641 1642| 错误码ID | 错误信息 | 1643| -------- | ---------------------- | 1644| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1645| 17620001 | memory error. | 1646| 17630001 | crypto operation error. | 1647 1648**示例:** 1649 1650```ts 1651import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1652import { BusinessError } from '@kit.BasicServicesKit'; 1653 1654let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1655let keyGenPromise = asyKeyGenerator.generateKeyPair(); 1656keyGenPromise.then(keyPair => { 1657 console.info('generateKeyPair success.'); 1658}).catch((error: BusinessError) => { 1659 console.error("generateKeyPair error."); 1660}); 1661``` 1662 1663### generateKeyPairSync<sup>12+</sup> 1664 1665generateKeyPairSync(): KeyPair 1666 1667同步获取该非对称密钥生成器随机生成的密钥。 1668 1669**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1670 1671**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1672 1673**返回值:** 1674 1675| 类型 | 说明 | 1676| ----------------- | --------------------------------- | 1677| [KeyPair](#keypair) | 非对称密钥。 | 1678 1679**错误码:** 1680以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1681 1682| 错误码ID | 错误信息 | 1683| -------- | ---------------------- | 1684| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1685| 17620001 | memory error. | 1686| 17630001 | crypto operation error. | 1687 1688**示例:** 1689 1690```ts 1691import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1692 1693let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1694try { 1695 let keyPairData = asyKeyGenerator.generateKeyPairSync(); 1696 if (keyPairData != null) { 1697 console.info('[Sync]: key pair success'); 1698 } else { 1699 console.error("[Sync]: get key pair result fail!"); 1700 } 1701} catch (e) { 1702 console.error(`sync error, ${e.code}, ${e.message}`); 1703} 1704``` 1705 1706### convertKey 1707 1708convertKey(pubKey: DataBlob | null, priKey: DataBlob | null, callback: AsyncCallback\<KeyPair\>): void 1709 1710异步获取指定数据生成非对称密钥,通过注册回调函数获取结果。详情请看下方**密钥转换说明**。 1711 1712**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1713 1714**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1715 1716API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1717 1718**参数:** 1719 1720| 参数名 | 类型 | 必填 | 说明 | 1721| -------- | ----------- | ---- | ------------------------------ | 1722| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1723| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1724| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 1725 1726**错误码:** 1727以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1728 1729| 错误码ID | 错误信息 | 1730| -------- | ---------------------- | 1731| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1732| 17620001 | memory error. | 1733| 17630001 | crypto operation error. | 1734 1735**示例:** 1736 1737```ts 1738import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1739 1740let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]); 1741let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]); 1742let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据 1743let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据 1744let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1745asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 1746 if (err) { 1747 console.error("convertKey: error."); 1748 return; 1749 } 1750 console.info('convertKey: success.'); 1751}); 1752``` 1753 1754### convertKey 1755 1756convertKey(pubKey: DataBlob | null, priKey: DataBlob | null): Promise\<KeyPair> 1757 1758异步获取指定数据生成非对称密钥,通过Promise获取结果。详情请看下方**密钥转换说明**。 1759 1760**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1761 1762**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1763 1764API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 1765 1766**参数:** 1767 1768| 参数名 | 类型 | 必填 | 说明 | 1769| ------ | -------- | ---- | ---------------- | 1770| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1771| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1772 1773**返回值:** 1774 1775| 类型 | 说明 | 1776| ----------------- | --------------------------------- | 1777| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 1778 1779**错误码:** 1780以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1781 1782| 错误码ID | 错误信息 | 1783| -------- | ---------------------- | 1784| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1785| 17620001 | memory error. | 1786| 17630001 | crypto operation error. | 1787 1788**示例:** 1789 1790```ts 1791import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1792import { BusinessError } from '@kit.BasicServicesKit'; 1793 1794let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]); 1795let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]); 1796let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据 1797let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据 1798let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1799let keyGenPromise = asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob); 1800keyGenPromise.then(keyPair => { 1801 console.info('convertKey success.'); 1802}).catch((error: BusinessError) => { 1803 console.error("convertKey error."); 1804}); 1805``` 1806 1807### convertKeySync<sup>12+</sup> 1808 1809convertKeySync(pubKey: DataBlob | null, priKey: DataBlob | null): KeyPair 1810 1811同步获取指定数据生成非对称密钥。详情请看下方**密钥转换说明**。 1812 1813**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1814 1815**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1816 1817**参数:** 1818 1819| 参数名 | 类型 | 必填 | 说明 | 1820| ------ | -------- | ---- | ---------------- | 1821| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1822| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 1823 1824**返回值:** 1825 1826| 类型 | 说明 | 1827| ----------------- | --------------------------------- | 1828| [KeyPair](#keypair) | 非对称密钥。 | 1829 1830**错误码:** 1831以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1832 1833| 错误码ID | 错误信息 | 1834| -------- | ---------------------- | 1835| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1836| 17620001 | memory error. | 1837| 17630001 | crypto operation error. | 1838 1839**示例:** 1840 1841```ts 1842import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1843 1844let pubKeyArray = new Uint8Array([48, 89, 48, 19, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7, 3, 66, 0, 4, 83, 96, 142, 9, 86, 214, 126, 106, 247, 233, 92, 125, 4, 128, 138, 105, 246, 162, 215, 71, 81, 58, 202, 121, 26, 105, 211, 55, 130, 45, 236, 143, 55, 16, 248, 75, 167, 160, 167, 106, 2, 152, 243, 44, 68, 66, 0, 167, 99, 92, 235, 215, 159, 239, 28, 106, 124, 171, 34, 145, 124, 174, 57, 92]); 1845let priKeyArray = new Uint8Array([48, 49, 2, 1, 1, 4, 32, 115, 56, 137, 35, 207, 0, 60, 191, 90, 61, 136, 105, 210, 16, 27, 4, 171, 57, 10, 61, 123, 40, 189, 28, 34, 207, 236, 22, 45, 223, 10, 189, 160, 10, 6, 8, 42, 134, 72, 206, 61, 3, 1, 7]); 1846let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据 1847let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据 1848let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1849try { 1850 let keyPairData = asyKeyGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 1851 if (keyPairData != null) { 1852 console.info('[Sync]: key pair success'); 1853 } else { 1854 console.error("[Sync]: convert key pair result fail!"); 1855 } 1856} catch (e) { 1857 console.error(`sync error, ${e.code}, ${e.message}`); 1858} 1859``` 1860 1861**密钥转换说明** 1862 18631. 非对称密钥(RSA、ECC、DSA)的公钥和私钥调用getEncoded()方法后,分别返回X.509格式和PKCS#8格式的二进制数据,其中对于ecc私钥,返回的是RFC5915定义格式。上述数据可用于跨应用传输或持久化存储。 18642. 当调用convertKey方法将外来二进制数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、DER编码格式,私钥应满足ASN.1语法、PKCS#8规范、DER编码格式。 18653. convertKey方法中,公钥和密钥二进制数据非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。 18664. convertKey或convertKeySync方法将外来二进制数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。 1867 1868### convertPemKey<sup>12+</sup> 1869 1870convertPemKey(pubKey: string | null, priKey: string | null): Promise\<KeyPair> 1871 1872异步获取指定数据生成非对称密钥,通过Promise获取结果。 1873 1874> **说明:** 1875> 1. 当调用convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、PEM编码格式,私钥应满足ASN.1语法、PKCS#8规范、PEM编码格式。 1876> 2. convertPemKey方法中,公钥和私钥字符串数据为非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。 1877> 3. convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。 1878 1879**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1880 1881**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1882 1883**参数:** 1884 1885| 参数名 | 类型 | 必填 | 说明 | 1886| ------ | -------- | ---- | ---------------- | 1887| pubKey | string \| null | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。| 1888| priKey | string \| null | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。| 1889 1890**返回值:** 1891 1892| 类型 | 说明 | 1893| ----------------- | --------------------------------- | 1894| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 1895 1896**错误码:** 1897以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1898 1899| 错误码ID | 错误信息 | 1900| -------- | ---------------------- | 1901| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1902| 17620001 | memory error. | 1903| 17630001 | crypto operation error. | 1904 1905**示例:** 1906 1907```ts 1908import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1909import { BusinessError } from '@kit.BasicServicesKit'; 1910 1911let priKeyPkcs1Str1024: string = 1912 "-----BEGIN RSA PRIVATE KEY-----\n" 1913 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 1914 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 1915 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 1916 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 1917 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 1918 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 1919 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 1920 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 1921 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 1922 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 1923 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 1924 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 1925 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 1926 + "-----END RSA PRIVATE KEY-----\n"; 1927 let publicPkcs1Str1024: string = 1928 "-----BEGIN RSA PUBLIC KEY-----\n" 1929 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 1930 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 1931 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 1932 + "-----END RSA PUBLIC KEY-----\n"; 1933async function TestConvertPemKeyByPromise() { 1934 let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 1935 let keyGenPromise = asyKeyGenerator.convertPemKey(publicPkcs1Str1024, priKeyPkcs1Str1024); 1936 keyGenPromise.then(keyPair => { 1937 console.info('convertPemKey success.'); 1938 }).catch((error: BusinessError) => { 1939 console.error("convertPemKey error."); 1940 }); 1941} 1942``` 1943 1944### convertPemKeySync<sup>12+</sup> 1945 1946convertPemKeySync(pubKey: string | null, priKey: string | null): KeyPair 1947 1948同步获取指定数据生成非对称密钥。 1949 1950> **说明:** 1951> convertPemKeySync接口与convertPemKey接口注意事项相同,见[convertPemKey](#convertpemkey12)接口说明。 1952 1953**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1954 1955**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1956 1957**参数:** 1958 1959| 参数名 | 类型 | 必填 | 说明 | 1960| ------ | -------- | ---- | ---------------- | 1961| pubKey | string \| null| 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。| 1962| priKey | string \| null| 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。| 1963 1964**返回值:** 1965 1966| 类型 | 说明 | 1967| ----------------- | --------------------------------- | 1968| [KeyPair](#keypair) | 非对称密钥。 | 1969 1970**错误码:** 1971以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1972 1973| 错误码ID | 错误信息 | 1974| -------- | ---------------------- | 1975| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1976| 17620001 | memory error. | 1977| 17630001 | crypto operation error. | 1978 1979**示例:** 1980 1981```ts 1982import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1983import { BusinessError } from '@kit.BasicServicesKit'; 1984 1985let priKeyPkcs1Str1024: string = 1986 "-----BEGIN RSA PRIVATE KEY-----\n" 1987 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 1988 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 1989 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 1990 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 1991 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 1992 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 1993 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 1994 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 1995 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 1996 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 1997 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 1998 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 1999 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 2000 + "-----END RSA PRIVATE KEY-----\n"; 2001 let publicPkcs1Str1024: string = 2002 "-----BEGIN RSA PUBLIC KEY-----\n" 2003 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 2004 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 2005 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 2006 + "-----END RSA PUBLIC KEY-----\n"; 2007function TestConvertPemKeyBySync() { 2008 let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 2009 try { 2010 let keyPairData = asyKeyGenerator.convertPemKeySync(publicPkcs1Str1024, priKeyPkcs1Str1024); 2011 if (keyPairData != null) { 2012 console.info('[Sync]: convert pem key pair success'); 2013 } else { 2014 console.error("[Sync]: convert pem key pair result fail!"); 2015 } 2016 } catch (e) { 2017 console.error(`Sync error, ${e.code}, ${e.message}`); 2018 } 2019} 2020``` 2021 2022## cryptoFramework.createAsyKeyGeneratorBySpec<sup>10+</sup> 2023 2024createAsyKeyGeneratorBySpec(asyKeySpec: AsyKeySpec): AsyKeyGeneratorBySpec 2025 2026通过指定密钥参数,获取相应的非对称密钥生成器实例。 2027 2028支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。 2029 2030**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2031 2032**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2033 2034API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2035 2036**参数:** 2037 2038| 参数名 | 类型 | 必填 | 说明 | 2039| ------- | ------ | ---- | -------------------------------- | 2040| asyKeySpec | [AsyKeySpec](#asykeyspec10) | 是 | 密钥参数。非对称密钥生成器根据指定的这些参数生成公/私钥。 | 2041 2042**返回值:** 2043 2044| 类型 | 说明 | 2045| ----------------------------------------------- | -------------------------- | 2046| [AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10) | 返回非对称密钥生成器实例。 | 2047 2048**错误码:** 2049以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2050 2051| 错误码ID | 错误信息 | 2052| -------- | ---------------------- | 2053| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2054| 801 | this operation is not supported. | 2055| 17620001 | memory error. | 2056 2057**示例:** 2058 2059```ts 2060import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2061 2062// 配置DSA1024公钥和私钥中包含的公共参数 2063function genDsa1024CommonSpecBigE() { 2064 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2065 algName: "DSA", 2066 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2067 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2068 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2069 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2070 } 2071 return dsaCommonSpec; 2072} 2073 2074// 设置DSA1024密钥对中包含的全参数 2075function genDsa1024KeyPairSpecBigE() { 2076 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2077 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2078 algName: "DSA", 2079 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2080 params: dsaCommonSpec, 2081 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2082 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2083 } 2084 return dsaKeyPairSpec; 2085} 2086 2087let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2088let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2089``` 2090 2091## AsyKeyGeneratorBySpec<sup>10+</sup> 2092 2093非对称密钥生成器。在使用该类的方法前,需要先使用[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法构建一个AsyKeyGeneratorBySpec实例。 2094 2095### 属性 2096 2097**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2098 2099**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2100 2101API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2102 2103| 名称 | 类型 | 可读 | 可写 | 说明 | 2104| ------- | ------ | ---- | ---- | -------------------------- | 2105| algName | string | 是 | 否 | 非对称密钥生成器的算法名。 | 2106 2107### generateKeyPair 2108 2109generateKeyPair(callback: AsyncCallback\<KeyPair>): void 2110 2111异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2112 2113当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2114 2115**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2116 2117**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2118 2119API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2120 2121**参数:** 2122 2123| 参数名 | 类型 | 必填 | 说明 | 2124| -------- | ----------------------- | ---- | ------------------------------ | 2125| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 2126 2127**错误码:** 2128以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2129 2130| 错误码ID | 错误信息 | 2131| -------- | ----------------------- | 2132| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types; | 2133| 17620001 | memory error. | 2134| 17630001 | crypto operation error. | 2135 2136**示例:** 2137 2138<!--code_no_check--> 2139```ts 2140let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2141let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2142asyKeyGeneratorBySpec.generateKeyPair((err, keyPair) => { 2143 if (err) { 2144 console.error("generateKeyPair: error."); 2145 return; 2146 } 2147 console.info('generateKeyPair: success.'); 2148}) 2149``` 2150 2151### generateKeyPair 2152 2153generateKeyPair(): Promise\<KeyPair> 2154 2155异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 2156 2157当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2158 2159**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2160 2161**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2162 2163API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2164 2165**返回值:** 2166 2167| 类型 | 说明 | 2168| ----------------- | --------------------------------- | 2169| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 2170 2171**错误码:** 2172以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2173 2174| 错误码ID | 错误信息 | 2175| -------- | ---------------------- | 2176| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2177| 17620001 | memory error. | 2178| 17630001 | crypto operation error. | 2179 2180**示例:** 2181 2182<!--code_no_check--> 2183```ts 2184import { BusinessError } from '@kit.BasicServicesKit'; 2185 2186let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2187let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2188let keyGenPromise = asyKeyGeneratorBySpec.generateKeyPair(); 2189keyGenPromise.then(keyPair => { 2190 console.info('generateKeyPair success.'); 2191}).catch((error: BusinessError) => { 2192 console.error("generateKeyPair error."); 2193}); 2194``` 2195 2196### generateKeyPairSync<sup>12+</sup> 2197 2198generateKeyPairSync(): KeyPair 2199 2200同步获取该非对称密钥生成器生成的密钥。 2201 2202当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2203 2204**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2205 2206**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2207 2208**返回值:** 2209 2210| 类型 | 说明 | 2211| ----------------- | --------------------------------- | 2212| [KeyPair](#keypair) | 非对称密钥。 | 2213 2214**错误码:** 2215以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2216 2217| 错误码ID | 错误信息 | 2218| -------- | ---------------------- | 2219| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2220| 17620001 | memory error. | 2221| 17630001 | crypto operation error. | 2222 2223**示例:** 2224 2225<!--code_no_check--> 2226```ts 2227import { BusinessError } from '@kit.BasicServicesKit'; 2228 2229let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2230let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2231try { 2232 let keyPairData = asyKeyGeneratorBySpec.generateKeyPairSync(); 2233 if (keyPairData != null) { 2234 console.info('[Sync]: key pair success'); 2235 } else { 2236 console.error("[Sync]: get key pair result fail!"); 2237 } 2238} catch (error) { 2239 let e: BusinessError = error as BusinessError; 2240 console.error(`sync error, ${e.code}, ${e.message}`); 2241} 2242``` 2243 2244### generatePriKey 2245 2246generatePriKey(callback: AsyncCallback\<PriKey>): void 2247 2248异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2249 2250当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。 2251 2252**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2253 2254**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2255 2256API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2257 2258**参数:** 2259 2260| 参数名 | 类型 | 必填 | 说明 | 2261| -------- | ----------------------- | ---- | ------------------------------ | 2262| callback | AsyncCallback\<[PriKey](#prikey)> | 是 | 回调函数,用于获取非对称密钥。 | 2263 2264**错误码:** 2265以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2266 2267| 错误码ID | 错误信息 | 2268| -------- | ---------------------- | 2269| 401 | invalid parameters. Possible causes: <br>Mandatory parameters are left unspecified; | 2270| 17620001 | memory error. | 2271| 17630001 | crypto operation error. | 2272 2273**示例:** 2274 2275<!--code_no_check--> 2276```ts 2277let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2278let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2279asyKeyGeneratorBySpec.generatePriKey((err, prikey) => { 2280 if (err) { 2281 console.error("generatePriKey: error."); 2282 return; 2283 } 2284 console.info('generatePriKey: success.'); 2285}) 2286``` 2287 2288### generatePriKey 2289 2290generatePriKey(): Promise\<PriKey> 2291 2292异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 2293 2294当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。 2295 2296**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2297 2298**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2299 2300API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2301 2302**返回值:** 2303 2304| 类型 | 说明 | 2305| ----------------- | --------------------------------- | 2306| Promise\<[PriKey](#prikey)> | 使用Promise的方式获取非对称密钥。 | 2307 2308**错误码:** 2309以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2310 2311| 错误码ID | 错误信息 | 2312| -------- | ---------------------- | 2313| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2314| 17620001 | memory error. | 2315| 17630001 | crypto operation error. | 2316 2317**示例:** 2318 2319<!--code_no_check--> 2320```ts 2321import { BusinessError } from '@kit.BasicServicesKit'; 2322 2323let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2324let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2325let keyGenPromise = asyKeyGeneratorBySpec.generatePriKey(); 2326keyGenPromise.then(priKey => { 2327 console.info('generatePriKey success.'); 2328}).catch((error: BusinessError) => { 2329 console.error("generatePriKey error."); 2330}); 2331``` 2332 2333### generatePriKeySync<sup>12+</sup> 2334 2335generatePriKeySync(): PriKey 2336 2337同步获取该非对称密钥生成器生成的密钥。 2338 2339当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。 2340 2341**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2342 2343**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2344 2345**返回值:** 2346 2347| 类型 | 说明 | 2348| ----------------- | --------------------------------- | 2349| [PriKey](#prikey) | 非对称密钥。 | 2350 2351**错误码:** 2352以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2353 2354| 错误码ID | 错误信息 | 2355| -------- | ---------------------- | 2356| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2357| 17620001 | memory error. | 2358| 17630001 | crypto operation error. | 2359 2360**示例:** 2361 2362<!--code_no_check--> 2363```ts 2364let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2365let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2366try { 2367 let priKeyData = asyKeyGeneratorBySpec.generatePriKeySync(); 2368 if (priKeyData != null) { 2369 console.info('[Sync]: pri key success'); 2370 } else { 2371 console.error("[Sync]: get pri key result fail!"); 2372 } 2373} catch (e) { 2374 console.error(`sync error, ${e.code}, ${e.message}`); 2375} 2376``` 2377 2378### generatePubKey 2379 2380generatePubKey(callback: AsyncCallback\<PubKey>): void 2381 2382异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2383 2384当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。 2385 2386**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2387 2388**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2389 2390API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2391 2392**参数:** 2393 2394| 参数名 | 类型 | 必填 | 说明 | 2395| -------- | ----------------------- | ---- | ------------------------------ | 2396| callback | AsyncCallback\<[PubKey](#pubkey)> | 是 | 回调函数,用于获取非对称密钥。 | 2397 2398**错误码:** 2399以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2400 2401| 错误码ID | 错误信息 | 2402| -------- | ---------------------- | 2403| 401 | invalid parameters. Possible causes:<br> Incorrect parameter types; | 2404| 17620001 | memory error. | 2405| 17630001 | crypto operation error. | 2406 2407**示例:** 2408 2409<!--code_no_check--> 2410```ts 2411let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2412let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2413asyKeyGeneratorBySpec.generatePubKey((err, pubKey) => { 2414 if (err) { 2415 console.error("generatePubKey: error."); 2416 return; 2417 } 2418 console.info('generatePubKey: success.'); 2419}) 2420``` 2421 2422### generatePubKey 2423 2424generatePubKey(): Promise\<PubKey> 2425 2426异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 2427 2428当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。 2429 2430**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2431 2432**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2433 2434API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2435 2436**返回值:** 2437 2438| 类型 | 说明 | 2439| ----------------- | --------------------------------- | 2440| Promise\<[PubKey](#pubkey)> | 使用Promise的方式获取非对称密钥。 | 2441 2442**错误码:** 2443以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2444 2445| 错误码ID | 错误信息 | 2446| -------- | ---------------------- | 2447| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2448| 17620001 | memory error. | 2449| 17630001 | crypto operation error. | 2450 2451**示例:** 2452 2453<!--code_no_check--> 2454```ts 2455import { BusinessError } from '@kit.BasicServicesKit'; 2456 2457let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2458let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2459let keyGenPromise = asyKeyGeneratorBySpec.generatePubKey(); 2460keyGenPromise.then(pubKey => { 2461 console.info('generatePubKey success.'); 2462}).catch((error: BusinessError) => { 2463 console.error("generatePubKey error."); 2464}); 2465``` 2466 2467### generatePubKeySync<sup>12+</sup> 2468 2469generatePubKeySync(): PubKey 2470 2471同步获取该非对称密钥生成器生成的密钥。 2472 2473当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。 2474 2475**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2476 2477**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2478 2479**返回值:** 2480 2481| 类型 | 说明 | 2482| ----------------- | --------------------------------- | 2483| [PubKey](#pubkey) | 非对称密钥。 | 2484 2485**错误码:** 2486以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2487 2488| 错误码ID | 错误信息 | 2489| -------- | ---------------------- | 2490| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2491| 17620001 | memory error. | 2492| 17630001 | crypto operation error. | 2493 2494**示例:** 2495 2496<!--code_no_check--> 2497```ts 2498let asyKeyPairSpec: cryptoFramework.DSAKeyPairSpec; // dsa as example, asyKeyPairSpec specifies full parameters contained in the private and public keys. The generation process is omitted here. 2499let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2500try { 2501 let pubKeyData = asyKeyGeneratorBySpec.generatePubKeySync(); 2502 if (pubKeyData != null) { 2503 console.info('[Sync]: pub key success'); 2504 } else { 2505 console.error("[Sync]: get pub key result fail!"); 2506 } 2507} catch (e) { 2508 console.error(`sync error, ${e.code}, ${e.message}`); 2509} 2510``` 2511 2512## ECCKeyUtil<sup>11+</sup> 2513 2514根据椭圆曲线名生成相应的非对称公共密钥参数。 2515 2516### genECCCommonParamsSpec<sup>11+</sup> 2517 2518static genECCCommonParamsSpec(curveName: string): ECCCommonParamsSpec 2519 2520根据椭圆曲线相应的NID(Name IDentifier)字符串名称生成相应的非对称公共密钥参数。详见[ECC密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#ecc)和[SM2密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#sm2)。 2521 2522**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2523 2524**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2525 2526API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2527 2528**参数:** 2529 2530| 参数名 | 类型 | 必填 | 说明 | 2531| ------- | ------ | ---- | ---------------------------------------------- | 2532| curveName | string | 是 | 椭圆曲线相应的NID(Name IDentifier)字符串名称。 | 2533 2534**返回值:** 2535 2536| 类型 | 说明 | 2537| ----------------- | --------------------------------- | 2538| [ECCCommonParamsSpec](#ecccommonparamsspec10) | 返回ECC公共密钥参数。 | 2539 2540**错误码:** 2541以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2542 2543| 错误码ID | 错误信息 | 2544| -------- | -------------------------------- | 2545| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2546| 801 | this operation is not supported. | 2547| 17620001 | memory error. | 2548 2549**示例:** 2550 2551```ts 2552import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2553import { BusinessError } from '@kit.BasicServicesKit'; 2554try { 2555 let ECCCommonParamsSpec = cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_brainpoolP160r1'); 2556 console.info('genECCCommonParamsSpec success'); 2557} catch (err) { 2558 let e: BusinessError = err as BusinessError; 2559 console.error(`genECCCommonParamsSpec error, ${e.code}, ${e.message}`); 2560} 2561``` 2562 2563### convertPoint<sup>12+</sup> 2564 2565static convertPoint(curveName: string, encodedPoint: Uint8Array): Point 2566 2567根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),将指定的点数据转换为Point对象。当前支持压缩/非压缩格式的点数据。 2568 2569> **说明:** 2570> 2571> 根据RFC5480规范中第2.2节的描述:<br/> 2572> 1. 非压缩的点数据,表示为:前缀0x04\|x坐标\|y坐标; 2573> 2. 压缩的点数据,对于Fp素数域上的点(当前暂不支持F2m域),表示为:前缀0x03\|x坐标 (坐标y是奇数时),前缀0x02\|x坐标 (坐标y是偶数时)。 2574 2575**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2576 2577**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2578 2579**参数:** 2580 2581| 参数名 | 类型 | 必填 | 说明 | 2582| ------------ | ---------- | ---- | ---------------------------------------------- | 2583| curveName | string | 是 | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 | 2584| encodedPoint | Uint8Array | 是 | 指定的ECC椭圆曲线上的点的数据。 | 2585 2586**返回值:** 2587 2588| 类型 | 说明 | 2589| ----------------- | ------------------- | 2590| [Point](#point10) | 返回ECC的Point对象。 | 2591 2592**错误码:** 2593以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2594 2595| 错误码ID | 错误信息 | 2596| -------- | ---------------------- | 2597| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2598| 17620001 | memory error. | 2599| 17630001 | crypto operation error. | 2600 2601**示例:** 2602 2603```ts 2604import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2605 2606// 随机生成的非压缩点数据 2607let pkData = new Uint8Array([4, 143, 39, 57, 249, 145, 50, 63, 222, 35, 70, 178, 121, 202, 154, 21, 146, 129, 75, 76, 63, 8, 195, 157, 111, 40, 217, 215, 148, 120, 224, 205, 82, 83, 92, 185, 21, 211, 184, 5, 19, 114, 33, 86, 85, 228, 123, 242, 206, 200, 98, 178, 184, 130, 35, 232, 45, 5, 202, 189, 11, 46, 163, 156, 152]); 2608let returnPoint = cryptoFramework.ECCKeyUtil.convertPoint('NID_brainpoolP256r1', pkData); 2609console.info('returnPoint: ' + returnPoint.x.toString(16)); 2610``` 2611 2612### getEncodedPoint<sup>12+</sup> 2613 2614static getEncodedPoint(curveName: string, point: Point, format: string): Uint8Array 2615 2616根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),按照指定的点数据格式,将Point对象转换为点数据。当前支持压缩/非压缩格式的点数据。 2617 2618**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2619 2620**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2621 2622**参数:** 2623 2624| 参数名 | 类型 | 必填 | 说明 | 2625| ------------ | ----------------- | ---- | ---------------------------------------------- | 2626| curveName | string | 是 | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 | 2627| point | [Point](#point10) | 是 | 椭圆曲线上的Point点对象。 | 2628| format | string | 是 | 需要获取的点数据格式,当前支持"COMPRESSED"或"UNCOMPRESSED"。 | 2629 2630**返回值:** 2631 2632| 类型 | 说明 | 2633| ----------------- | --------------------------------- | 2634| Uint8Array | 返回指定格式的点数据。 | 2635 2636**错误码:** 2637以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2638 2639| 错误码ID | 错误信息 | 2640| -------- | ---------------------- | 2641| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2642| 17620001 | memory error. | 2643| 17630001 | crypto operation error. | 2644 2645**示例:** 2646 2647```ts 2648import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2649 2650async function doTest() { 2651 let generator = cryptoFramework.createAsyKeyGenerator('ECC_BrainPoolP256r1'); 2652 let keyPair = await generator.generateKeyPair(); 2653 let eccPkX = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_X_BN); 2654 let eccPkY = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_Y_BN); 2655 console.info('ECC_PK_X_BN 16:' + eccPkX.toString(16)); 2656 console.info('ECC_PK_Y_BN 16:' + eccPkY.toString(16)); 2657 // 将eccPkX.toString(16)结果放入x,eccPkY.toString(16)结果放入y 2658 let returnPoint: cryptoFramework.Point = { 2659 x: BigInt('0x' + eccPkX.toString(16)), 2660 y: BigInt('0x' + eccPkY.toString(16)) 2661 }; 2662 let returnData = cryptoFramework.ECCKeyUtil.getEncodedPoint('NID_brainpoolP256r1', returnPoint, 'UNCOMPRESSED'); 2663 console.info('returnData: ' + returnData); 2664} 2665``` 2666 2667## DHKeyUtil<sup>11+</sup> 2668 2669根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。 2670 2671### genDHCommonParamsSpec<sup>11+</sup> 2672 2673static genDHCommonParamsSpec(pLen: number, skLen?: number): DHCommonParamsSpec 2674 2675根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。详见[DH密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#dh)。 2676 2677**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2678 2679**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2680 2681API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey 2682 2683**参数:** 2684 2685| 参数名 | 类型 | 必填 | 说明 | 2686| ------ | ------ | ---- | ------------------------------------------------ | 2687| pLen | number | 是 | 用于指定DH公共密钥参数中素数P的长度,单位为bit。 | 2688| skLen | number | 否 | 用于指定DH公共密钥参数中私钥的长度,单位为bit。 | 2689 2690**返回值:** 2691 2692| 类型 | 说明 | 2693| ----------------- | --------------------------------- | 2694| [DHCommonParamsSpec](#dhcommonparamsspec11) | 返回DH公共密钥参数。 | 2695 2696**错误码:** 2697以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2698 2699| 错误码ID | 错误信息 | 2700| -------- | -------------------------------- | 2701| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2702| 801 | this operation is not supported. | 2703| 17620001 | memory error. | 2704| 17630001 | crypto operation error. | 2705 2706**示例:** 2707 2708```ts 2709import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2710import { BusinessError } from '@kit.BasicServicesKit'; 2711try { 2712 let DHCommonParamsSpec = cryptoFramework.DHKeyUtil.genDHCommonParamsSpec(2048); 2713 console.info('genDHCommonParamsSpec success'); 2714} catch (err) { 2715 let e: BusinessError = err as BusinessError; 2716 console.error(`genDHCommonParamsSpec error, ${e.code}, ${e.message}`); 2717} 2718``` 2719 2720## SM2CryptoUtil<sup>12+</sup> 2721 2722用于SM2密码学运算的工具类。 2723 2724### genCipherTextBySpec<sup>12+</sup> 2725 2726static genCipherTextBySpec(spec: SM2CipherTextSpec, mode?: string): DataBlob 2727 2728根据指定的SM2密文参数,生成符合国密标准的ASN.1格式的SM2密文。 2729 2730**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2731 2732**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2733 2734**参数:** 2735 2736| 参数名 | 类型 | 必填 | 说明 | 2737| ------ | ------ | ---- | ------------------------------------------------ | 2738| spec | [SM2CipherTextSpec](#sm2ciphertextspec12) | 是 | 指定的SM2密文参数。 | 2739| mode | string | 否 | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。 | 2740 2741**返回值:** 2742 2743| 类型 | 说明 | 2744| ----------------- | --------------------------------- | 2745| [DataBlob](#datablob) | 返回符合国密标准的ASN.1格式的SM2密文。 | 2746 2747**错误码:** 2748以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2749 2750| 错误码ID | 错误信息 | 2751| -------- | -------------------------------- | 2752| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2753| 17620001 | memory error. | 2754| 17630001 | crypto operation error. | 2755 2756**示例:** 2757 2758```ts 2759import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2760import { BusinessError } from '@kit.BasicServicesKit'; 2761try { 2762 let spec : cryptoFramework.SM2CipherTextSpec = { 2763 xCoordinate: BigInt('20625015362595980457695435345498579729138244358573902431560627260141789922999'), 2764 yCoordinate: BigInt('48563164792857017065725892921053777369510340820930241057309844352421738767712'), 2765 cipherTextData: new Uint8Array([100,227,78,195,249,179,43,70,242,69,169,10,65,123]), 2766 hashData: new Uint8Array([87,167,167,247,88,146,203,234,83,126,117,129,52,142,82,54,152,226,201,111,143,115,169,125,128,42,157,31,114,198,109,244]), 2767 } 2768 let data = cryptoFramework.SM2CryptoUtil.genCipherTextBySpec(spec, 'C1C3C2'); 2769 console.info('genCipherTextBySpec success'); 2770} catch (err) { 2771 let e: BusinessError = err as BusinessError; 2772 console.error(`genCipherTextBySpec error, ${e.code}, ${e.message}`); 2773} 2774``` 2775 2776### getCipherTextSpec<sup>12+</sup> 2777 2778static getCipherTextSpec(cipherText: DataBlob, mode?: string): SM2CipherTextSpec 2779 2780从符合国密标准的ASN.1格式的SM2密文中,获取具体的SM2密文参数。 2781 2782**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2783 2784**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2785 2786**参数:** 2787 2788| 参数名 | 类型 | 必填 | 说明 | 2789| ------ | ------ | ---- | ------------------------------------------------ | 2790| cipherText | [DataBlob](#datablob) | 是 | 符合国密标准的ASN.1格式的SM2密文。 2791| mode | string | 否 | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。 | 2792 2793**返回值:** 2794 2795| 类型 | 说明 | 2796| ----------------- | --------------------------------- | 2797| [SM2CipherTextSpec](#sm2ciphertextspec12) | 返回具体的SM2密文参数。 | 2798 2799**错误码:** 2800以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2801 2802| 错误码ID | 错误信息 | 2803| -------- | -------------------------------- | 2804| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2805| 17620001 | memory error. | 2806| 17630001 | crypto operation error. | 2807 2808```ts 2809import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2810import { BusinessError } from '@kit.BasicServicesKit'; 2811try { 2812 let cipherTextArray = new Uint8Array([48,118,2,32,45,153,88,82,104,221,226,43,174,21,122,248,5,232,105,41,92,95,102,224,216,149,85,236,110,6,64,188,149,70,70,183,2,32,107,93,198,247,119,18,40,110,90,156,193,158,205,113,170,128,146,109,75,17,181,109,110,91,149,5,110,233,209,78,229,96,4,32,87,167,167,247,88,146,203,234,83,126,117,129,52,142,82,54,152,226,201,111,143,115,169,125,128,42,157,31,114,198,109,244,4,14,100,227,78,195,249,179,43,70,242,69,169,10,65,123]); 2813 let cipherText : cryptoFramework.DataBlob = {data : cipherTextArray}; 2814 let spec : cryptoFramework.SM2CipherTextSpec = cryptoFramework.SM2CryptoUtil.getCipherTextSpec(cipherText, 'C1C3C2'); 2815 console.info('getCipherTextSpec success'); 2816} catch (err) { 2817 let e: BusinessError = err as BusinessError; 2818 console.error(`getCipherTextSpec error, ${e.code}, ${e.message}`); 2819} 2820``` 2821 2822## cryptoFramework.createCipher 2823 2824createCipher(transformation: string): Cipher 2825 2826通过指定算法名称,获取相应的[Cipher](#cipher)实例。 2827 2828支持的规格详见[对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-sym-encrypt-decrypt-spec.md)和[非对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md)。 2829 2830**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2831 2832**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2833 2834API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 2835 2836**参数:** 2837 2838| 参数名 | 类型 | 必填 | 说明 | 2839| -------------- | ------ | ---- | ------------------------------------------------------------ | 2840| transformation | string | 是 | 待生成Cipher的算法名称(含密钥长度)、加密模式以及填充方法的组合。 | 2841 2842> **说明:** 2843> 2844> 1. 目前对称加解密中,PKCS5和PKCS7的实现相同,其padding长度和分组长度保持一致(即PKCS5和PKCS7在3DES中均按照8字节填充,在AES中均按照16字节填充),另有NoPadding表示不填充。 2845> <br/>开发者需要自行了解密码学不同分组模式的差异,以便选择合适的参数规格。例如选择ECB和CBC模式时,建议启用填充,否则必须确保明文长度是分组大小的整数倍;选择其他模式时,可以不启用填充,此时密文长度和明文长度一致(即可能不是分组大小的整数倍)。 2846> 2. 使用RSA、SM2进行非对称加解密时,必须创建两个Cipher对象分别进行加密和解密操作,而不能对同一个Cipher对象进行加解密。对称加解密没有此要求(即只要算法规格一样,可以对同一个Cipher对象进行加解密操作)。 2847 2848**返回值:** 2849 2850| 类型 | 说明 | 2851| ----------------- | ------------------------ | 2852| [Cipher](#cipher) | 返回加解密生成器的对象。 | 2853 2854**错误码:** 2855以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2856 2857| 错误码ID | 错误信息 | 2858| -------- | ---------------------- | 2859| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2860| 801 | this operation is not supported. | 2861| 17620001 | memory error. | 2862 2863**示例:** 2864 2865```ts 2866import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2867import { BusinessError } from '@kit.BasicServicesKit'; 2868 2869let cipherAlgName = '3DES192|ECB|PKCS7'; 2870try { 2871 let cipher = cryptoFramework.createCipher(cipherAlgName); 2872 console.info('cipher algName:' + cipher.algName); 2873} catch (error) { 2874 let e: BusinessError = error as BusinessError; 2875 console.error(`sync error, ${e.code}, ${e.message}`); 2876} 2877``` 2878 2879## Cipher 2880 2881提供加解密的算法操作功能,按序调用本类中的[init()](#init-1)、[update()](#update)、[doFinal()](#dofinal)方法,可以实现对称加密/对称解密/非对称加密/非对称解密。 2882 2883完整的加解密流程示例可参考开发指导中的[加解密开发指导](../../security/CryptoArchitectureKit/crypto-encryption-decryption-overview.md)。 2884 2885一次完整的加/解密流程在对称加密和非对称加密中略有不同: 2886 2887- 对称加解密:init为必选,update为可选(且允许多次update加/解密大数据),doFinal为必选;doFinal结束后可以重新init开始新一轮加/解密流程。 2888- RSA、SM2非对称加解密:init为必选,不支持update操作,doFinal为必选(允许连续多次doFinal加/解密大数据);RSA不支持重复init,切换加解密模式或填充方式时,需要重新创建Cipher对象。 2889 2890### 属性 2891 2892**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2893 2894**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2895 2896API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 2897 2898| 名称 | 类型 | 可读 | 可写 | 说明 | 2899| ------- | ------ | ---- | ---- | ---------------------------- | 2900| algName | string | 是 | 否 | 加解密生成器指定的算法名称。 | 2901 2902### init 2903 2904init(opMode: CryptoMode, key: Key, params: ParamsSpec | null, callback: AsyncCallback\<void>): void 2905 2906初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 2907 2908必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 2909 2910**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2911 2912**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2913 2914API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 2915 2916**参数:** 2917 2918| 参数名 | 类型 | 必填 | 说明 | 2919| -------- | ------------------------- | ---- | ------------------------------------------------------------ | 2920| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 2921| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 2922| params | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前只支持ParamsSpec, API 10之后增加支持null。 | 2923| callback | AsyncCallback\<void> | 是 | 回调函数。当加解密初始化成功,err为undefined,否则为错误对象。 | 2924 2925**错误码:** 2926以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2927 2928| 错误码ID | 错误信息 | 2929| -------- | --------------------------------------------------------- | 2930| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2931| 17620001 | memory error. | 2932| 17620002 | runtime error. | 2933| 17630001 | crypto operation error.| 2934 2935### init 2936 2937init(opMode: CryptoMode, key: Key, params: ParamsSpec | null): Promise\<void> 2938 2939初始化加解密的cipher对象,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 2940 2941必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 2942 2943**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2944 2945**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2946 2947API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 2948 2949**参数:** 2950 2951| 参数名 | 类型 | 必填 | 说明 | 2952| ------ | ------------------------- | ---- | ------------------------------------------------------------ | 2953| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 2954| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 2955| params | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前只支持ParamsSpec, API 10之后增加支持null。 | 2956 2957**返回值:** 2958 2959| 类型 | 说明 | 2960| -------------- | -------------------------------------- | 2961| Promise\<void> | 无返回结果的Promise对象。 | 2962 2963**错误码:** 2964以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2965 2966| 错误码ID | 错误信息 | 2967| -------- | ------------------------------------------------- | 2968| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2969| 17620001 | memory error. | 2970| 17620002 | runtime error. | 2971| 17630001 | crypto operation error.| 2972 2973### initSync<sup>12+</sup> 2974 2975initSync(opMode: CryptoMode, key: Key, params: ParamsSpec | null): void 2976 2977初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。 2978 2979必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 2980 2981**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2982 2983**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 2984 2985**参数:** 2986 2987| 参数名 | 类型 | 必填 | 说明 | 2988| ------ | ----------------------------------------------- | ---- | ------------------------------------------------------------ | 2989| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 2990| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 2991| params | [ParamsSpec](#paramsspec) | 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 | 2992 2993**错误码:** 2994以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2995 2996| 错误码ID | 错误信息 | 2997| -------- | ----------------------- | 2998| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2999| 17620001 | memory error. | 3000| 17620002 | runtime error. | 3001| 17630001 | crypto operation error. | 3002 3003### update 3004 3005update(data: DataBlob, callback: AsyncCallback\<DataBlob>): void 3006 3007分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。 3008 3009必须在对[Cipher](#cipher)实例使用[init()](#init-1)初始化后,才能使用本函数。 3010 3011> **说明:** 3012> 3013> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和doFinal结果产生影响。<br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。) 3014> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。<br/> 3015> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,采用多次update的方式传入数据。<br/> 3016> AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。 3017> 3. RSA、SM2非对称加解密不支持update操作。 3018> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。 3019 3020**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3021 3022**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3023 3024API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3025 3026**参数:** 3027 3028| 参数名 | 类型 | 必填 | 说明 | 3029| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ | 3030| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。data不能为null。 | 3031| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数。当更新加/解密数据成功,err为undefined,data为此次更新的加/解密结果DataBlob;否则为错误对象。 | 3032 3033**错误码:** 3034以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3035 3036| 错误码ID | 错误信息 | 3037| -------- | ------------------------------------------- | 3038| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3039| 17620001 | memory error. | 3040| 17620002 | runtime error. | 3041| 17630001 | crypto operation error. | 3042 3043### update 3044 3045update(data: DataBlob): Promise\<DataBlob> 3046 3047分段更新加密或者解密数据操作,通过Promise获取加/解密数据。 3048 3049必须在对[Cipher](#cipher)实例使用[init()](#init-2)初始化后,才能使用本函数。 3050 3051> **说明:** 3052> 3053> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和doFinal结果产生影响。 3054> <br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。) 3055> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。<br/> 3056> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,可以采用多次update的方式传入数据。<br/> 3057> AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。 3058> 3. RSA、SM2非对称加解密不支持update操作。 3059> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。 3060 3061**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3062 3063**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3064 3065API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3066 3067**参数:** 3068 3069| 参数名 | 类型 | 必填 | 说明 | 3070| ---- | --------------------- | ---- | -------------------- | 3071| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。data不能为null。 | 3072 3073**返回值:** 3074 3075| 类型 | 说明 | 3076| ------------------------------- | ------------------------------------------------ | 3077| Promise\<[DataBlob](#datablob)> | Promise对象,返回此次更新的加/解密结果DataBlob。 | 3078 3079**错误码:** 3080以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3081 3082| 错误码ID | 错误信息 | 3083| -------- | -------------------------------------------- | 3084| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3085| 17620001 | memory error. | 3086| 17620002 | runtime error. | 3087| 17630001 | crypto operation error. | 3088 3089### updateSync<sup>12+</sup> 3090 3091updateSync(data: DataBlob): DataBlob 3092 3093分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。 3094 3095必须在对[Cipher](#cipher)实例使用[initSync()](#initsync12)初始化后,才能使用本函数。 3096 3097其他注意事项同上异步接口说明。 3098 3099**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3100 3101**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3102 3103**参数:** 3104 3105| 参数名 | 类型 | 必填 | 说明 | 3106| ------ | --------------------- | ---- | ------------------------------------------------------------ | 3107| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。data不能为null。 | 3108 3109**错误码:** 3110以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3111 3112| 错误码ID | 错误信息 | 3113| -------- | ----------------------- | 3114| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3115| 17620001 | memory error. | 3116| 17620002 | runtime error. | 3117| 17630001 | crypto operation error. | 3118 3119### doFinal 3120 3121doFinal(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void 3122 3123(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过注册回调函数获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用[update](#update-4)传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别: 3124 3125- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。 3126- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。 3127 3128(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。 3129 3130> **说明:** 3131> 3132> 1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用init()并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。 3133> 2. 如果遇到解密失败,需检查加解密数据和init时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。 3134> 3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。 3135> 4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。 3136 3137**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3138 3139**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3140 3141API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3142 3143**参数:** 3144 3145| 参数名 | 类型 | 必填 | 说明 | 3146| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ | 3147| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。API 10之前只支持DataBlob, API 10之后增加支持null。 | 3148| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数。当最终加/解密数据成功,err为undefined,data为剩余数据的加/解密结果DataBlob;否则为错误对象。 | 3149 3150**错误码:** 3151以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3152 3153| 错误码ID | 错误信息 | 3154| -------- | ----------------------- | 3155| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3156| 17620001 | memory error. | 3157| 17620002 | runtime error. | 3158| 17630001 | crypto operation error. | 3159 3160**以AES GCM模式加密为例:** 3161 3162此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 3163 3164```ts 3165import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3166import { buffer } from '@kit.ArkTS'; 3167 3168function generateRandom(len: number) { 3169 let rand = cryptoFramework.createRandom(); 3170 let generateRandSync = rand.generateRandomSync(len); 3171 return generateRandSync; 3172} 3173 3174function genGcmParamsSpec() { 3175 let ivBlob = generateRandom(12); 3176 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 3177 let dataAad = new Uint8Array(arr); 3178 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 3179 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 3180 let dataTag = new Uint8Array(arr); 3181 let tagBlob: cryptoFramework.DataBlob = { 3182 data: dataTag 3183 }; 3184 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 3185 iv: ivBlob, 3186 aad: aadBlob, 3187 authTag: tagBlob, 3188 algName: "GcmParamsSpec" 3189 }; 3190 return gcmParamsSpec; 3191} 3192 3193function cipherByCallback() { 3194 let gcmParams = genGcmParamsSpec(); 3195 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 3196 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 3197 symKeyGenerator.generateSymKey((err, symKey) => { 3198 cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams, (err,) => { 3199 let message = "This is a test"; 3200 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 3201 cipher.update(plainText, (err, encryptUpdate) => { 3202 cipher.doFinal(null, (err, tag) => { 3203 gcmParams.authTag = tag; 3204 console.info('encryptUpdate plainText:' + encryptUpdate.data); 3205 }); 3206 }); 3207 }); 3208 }); 3209} 3210``` 3211 3212### doFinal 3213 3214doFinal(data: DataBlob | null): Promise\<DataBlob> 3215 3216(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过Promise获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用update传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别: 3217 3218- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。 3219- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。 3220 3221(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过Promise获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。 3222 3223> **说明:** 3224> 3225> 1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用init()并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。 3226> 2. 如果遇到解密失败,需检查加解密数据和init时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。 3227> 3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。 3228> 4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。 3229 3230**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3231 3232**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3233 3234API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3235 3236**参数:** 3237 3238| 参数名 | 类型 | 必填 | 说明 | 3239| ---- | --------------------- | ---- | -------------------- | 3240| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 加密或者解密的数据。data参数允许为null,但不允许传入{data: Uint8Array(空) }。API 10之前只支持DataBlob, API 10之后增加支持null。 | 3241 3242**返回值:** 3243 3244| 类型 | 说明 | 3245| ------------------------------- | ------------------------------------------------ | 3246| Promise\<[DataBlob](#datablob)> | Promise对象,返回剩余数据的加/解密结果DataBlob。 | 3247 3248**错误码:** 3249以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3250 3251| 错误码ID | 错误信息 | 3252| -------- | -------------------------------------------- | 3253| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3254| 17620001 | memory error. | 3255| 17620002 | runtime error. | 3256| 17630001 | crypto operation error. | 3257 3258**以AES GCM模式加密为例:** 3259 3260此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 3261 3262```ts 3263import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3264import { buffer } from '@kit.ArkTS'; 3265 3266function generateRandom(len: number) { 3267 let rand = cryptoFramework.createRandom(); 3268 let generateRandSync = rand.generateRandomSync(len); 3269 return generateRandSync; 3270} 3271 3272function genGcmParamsSpec() { 3273 let ivBlob = generateRandom(12); 3274 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 3275 let dataAad = new Uint8Array(arr); 3276 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 3277 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 3278 let dataTag = new Uint8Array(arr); 3279 let tagBlob: cryptoFramework.DataBlob = { 3280 data: dataTag 3281 }; 3282 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 3283 iv: ivBlob, 3284 aad: aadBlob, 3285 authTag: tagBlob, 3286 algName: "GcmParamsSpec" 3287 }; 3288 return gcmParamsSpec; 3289} 3290 3291async function cipherByPromise() { 3292 let gcmParams = genGcmParamsSpec(); 3293 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 3294 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 3295 let symKey = await symKeyGenerator.generateSymKey(); 3296 await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams); 3297 let message = "This is a test"; 3298 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 3299 let encryptUpdate = await cipher.update(plainText); 3300 gcmParams.authTag = await cipher.doFinal(null); 3301 console.info('encryptUpdate plainText: ' + encryptUpdate.data); 3302} 3303``` 3304 3305### doFinalSync<sup>12+</sup> 3306 3307doFinalSync(data: DataBlob | null): DataBlob 3308 3309(1)在对称加解密中,doFinalSync加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过注册回调函数获取加密或者解密数据。<br/>如果数据量较小,可以在doFinalSync中一次性传入数据,而不使用updateSync;如果在本次加解密流程中,已经使用[updateSync](#updatesync12)传入过数据,可以在doFinalSync的data参数处传入null。<br/>根据对称加解密的模式不同,doFinalSync的输出有如下区别: 3310 3311- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次updateSync和doFinalSync的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinalSync的data参数传入null,则doFinalSync的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。 3312- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次updateSync和doFinalSync的结果拼接起来,得到完整的明文/密文。 3313 3314(2)在RSA、SM2非对称加解密中,doFinalSync加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinalSync,拼接结果得到完整的明文/密文。 3315 3316其他注意事项同接口[doFinal()](#dofinal)说明。 3317 3318**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3319 3320**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3321 3322**参数:** 3323 3324| 参数名 | 类型 | 必填 | 说明 | 3325| ------ | ------------------------------------------- | ---- | ------------------------------------------------------------ | 3326| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。 | 3327 3328**错误码:** 3329以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3330 3331| 错误码ID | 错误信息 | 3332| -------- | ----------------------- | 3333| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3334| 17620001 | memory error. | 3335| 17620002 | runtime error. | 3336| 17630001 | crypto operation error. | 3337 3338**以AES GCM模式加密为例:** 3339 3340此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 3341 3342```ts 3343import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3344import { buffer } from '@kit.ArkTS'; 3345 3346function generateRandom(len: number) { 3347 let rand = cryptoFramework.createRandom(); 3348 let generateRandSync = rand.generateRandomSync(len); 3349 return generateRandSync; 3350} 3351 3352function genGcmParamsSpec() { 3353 let ivBlob = generateRandom(12); 3354 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 3355 let dataAad = new Uint8Array(arr); 3356 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 3357 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 3358 let dataTag = new Uint8Array(arr); 3359 let tagBlob: cryptoFramework.DataBlob = { 3360 data: dataTag 3361 }; 3362 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 3363 iv: ivBlob, 3364 aad: aadBlob, 3365 authTag: tagBlob, 3366 algName: "GcmParamsSpec" 3367 }; 3368 return gcmParamsSpec; 3369} 3370 3371async function cipherBySync() { 3372 let gcmParams = genGcmParamsSpec(); 3373 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 3374 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 3375 let symKey = await symKeyGenerator.generateSymKey(); 3376 await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams); 3377 let message = "This is a test"; 3378 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 3379 let encryptUpdate = cipher.updateSync(plainText); 3380 gcmParams.authTag = cipher.doFinalSync(null); 3381 console.info('encryptUpdate plainText: ' + encryptUpdate.data); 3382} 3383 3384``` 3385 3386### setCipherSpec<sup>10+</sup> 3387 3388setCipherSpec(itemType: CipherSpecItem, itemValue: Uint8Array): void 3389 3390设置加解密参数。常用的加解密参数可以直接通过[createCipher](#cryptoframeworkcreatecipher) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。 3391 3392**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3393 3394**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3395 3396API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3397 3398**参数:** 3399 3400| 参数名 | 类型 | 必填 | 说明 | 3401| -------- | -------------------- | ---- | ---------- | 3402| itemType | [CipherSpecItem](#cipherspecitem10) | 是 | 用于指定需要设置的加解密参数。 | 3403| itemValue | Uint8Array | 是 | 用于指定加解密参数的具体值。 | 3404 3405**错误码:** 3406以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3407 3408| 错误码ID | 错误信息 | 3409| -------- | ---------------------- | 3410| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3411| 801 | this operation is not supported. | 3412| 17620001 | memory error. | 3413| 17630001 | crypto operation error. | 3414 3415**示例:** 3416 3417<!--code_no_check--> 3418```ts 3419let cipher: cryptoFramework.Cipher; // The process of generating the Cipher instance is omitted here. 3420let pSource = new Uint8Array([1,2,3,4]); 3421cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource); 3422``` 3423 3424### getCipherSpec<sup>10+</sup> 3425 3426getCipherSpec(itemType: CipherSpecItem): string | Uint8Array 3427 3428获取加解密参数。当前只支持RSA算法和SM2算法,从API version 11开始,支持SM2算法获取加解密参数。 3429 3430**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3431 3432**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3433 3434API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Cipher 3435 3436**参数:** 3437 3438| 参数名 | 类型 | 必填 | 说明 | 3439| ------ | -------- | ---- | ---------- | 3440| itemType | [CipherSpecItem](#cipherspecitem10) | 是 | 用于指定需要获取的加解密参数。 | 3441 3442**返回值:** 3443 3444| 类型 | 说明 | 3445| -------------- | ----------- | 3446| string \| Uint8Array | 获取的加解密参数的具体值。 | 3447 3448**错误码:** 3449以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3450 3451| 错误码ID | 错误信息 | 3452| -------- | ---------------------- | 3453| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3454| 801 | this operation is not supported. | 3455| 17620001 | memory error. | 3456| 17630001 | crypto operation error. | 3457 3458**示例:** 3459 3460<!--code_no_check--> 3461```ts 3462let cipher: cryptoFramework.Cipher; // The process of generating the Cipher instance is omitted here. 3463let mdName = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR); 3464``` 3465 3466## cryptoFramework.createSign 3467 3468createSign(algName: string): Sign 3469 3470Sign实例生成。 3471 3472支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。 3473 3474**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3475 3476**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3477 3478API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3479 3480**参数:** 3481 3482| 参数名 | 类型 | 必填 | 说明 | 3483| ------- | ------ | ---- | ------------------------------------------------------------ | 3484| algName | string | 是 | 指定签名算法:RSA,ECC,DSA,SM2<sup>10+</sup>或ED25519<sup>11+</sup>。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。<br/>使用RSA算法签名时,通过设置OnlySign参数可支持传入数据摘要仅作签名。 | 3485 3486**返回值**: 3487 3488| 类型 | 说明 | 3489| ---- | ---------------------------------- | 3490| Sign | 返回由输入算法指定生成的Sign对象。 | 3491 3492**错误码:** 3493以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3494 3495| 错误码ID | 错误信息 | 3496| -------- | ---------------------- | 3497| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3498| 801 | this operation is not supported. | 3499| 17620001 | memory error. | 3500 3501**示例:** 3502 3503```ts 3504import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3505 3506let signer1 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 3507 3508let signer2 = cryptoFramework.createSign('RSA1024|PSS|SHA256|MGF1_SHA256'); 3509 3510let signer3 = cryptoFramework.createSign('ECC224|SHA256'); 3511 3512let signer4 = cryptoFramework.createSign('DSA2048|SHA256'); 3513 3514let signer5 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256|OnlySign'); 3515``` 3516 3517## Sign 3518 3519Sign类,使用Sign方法之前需要创建该类的实例进行操作,通过[createSign(algName: string): Sign](#cryptoframeworkcreatesign)方法构造此实例。按序调用本类中的init、update、sign方法完成签名操作。签名操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 3520 3521Sign类不支持重复初始化,当业务方需要使用新密钥签名时,需要重新创建新Sign对象并调用init初始化。 3522 3523业务方使用时,在createSign时确定签名的模式,调用init接口设置密钥。 3524 3525当待签名数据较短时,可在init初始化后,(无需update)直接调用sign接口传入原文数据进行签名。 3526 3527当待签名数据较长时,可通过update接口分段传入切分后的原文数据,最后调用sign接口对整体原文数据进行签名。 3528 3529当使用update分段传入原文时,sign接口API 10之前只支持传入DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用sign进行签名。 3530 3531当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 3532 3533### 属性 3534 3535**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3536 3537**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3538 3539API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3540 3541| 名称 | 类型 | 可读 | 可写 | 说明 | 3542| ------- | ------ | ---- | ---- | ---------------------------- | 3543| algName | string | 是 | 否 | 签名指定的算法名称。 | 3544 3545### init 3546 3547init(priKey: PriKey, callback: AsyncCallback\<void>): void 3548 3549使用私钥初始化Sign对象,通过注册回调函数获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。 3550 3551Sign类暂不支持重复init。 3552 3553**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3554 3555**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3556 3557API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3558 3559**参数:** 3560 3561| 参数名 | 类型 | 必填 | 说明 | 3562| -------- | -------------------- | ---- | ---------------- | 3563| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 3564| callback | AsyncCallback\<void> | 是 | 回调函数。当签名初始化成功,err为undefined,否则为错误对象。 | 3565 3566**错误码:** 3567以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3568 3569| 错误码ID | 错误信息 | 3570| -------- | ---------------------- | 3571| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3572| 17620001 | memory error. | 3573| 17620002 | runtime error. | 3574| 17630001 | crypto operation error. | 3575 3576### init 3577 3578init(priKey: PriKey): Promise\<void> 3579 3580使用私钥初始化Sign对象,通过Promise获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。 3581 3582Sign类暂不支持重复init。 3583 3584**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3585 3586**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3587 3588API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3589 3590**参数:** 3591 3592| 参数名 | 类型 | 必填 | 说明 | 3593| ------ | ---- | ---- | ---------------- | 3594| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 3595 3596**返回值:** 3597 3598| 类型 | 说明 | 3599| -------------- | ------------- | 3600| Promise\<void> | 无返回结果的Promise对象。 | 3601 3602**错误码:** 3603以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3604 3605| 错误码ID | 错误信息 | 3606| -------- | ---------------------- | 3607| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3608| 17620001 | memory error. | 3609| 17620002 | runtime error. | 3610| 17630001 | crypto operation error. | 3611 3612### initSync<sup>12+</sup> 3613 3614initSync(priKey: PriKey): void 3615 3616使用私钥初始化Sign对象,通过同步方式获取结果。initSync、updateSync、signSync为三段式接口,需要成组使用。其中initSync和signSync必选,updateSync可选。 3617 3618Sign类暂不支持重复initSync。 3619 3620**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3621 3622**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3623 3624**参数:** 3625 3626| 参数名 | 类型 | 必填 | 说明 | 3627| ------ | ---- | ---- | ---------------- | 3628| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 3629 3630**错误码:** 3631以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3632 3633| 错误码ID | 错误信息 | 3634| -------- | ---------------------- | 3635| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3636| 17620001 | memory error. | 3637| 17620002 | runtime error. | 3638| 17630001 | crypto operation error. | 3639 3640### update 3641 3642update(data: DataBlob, callback: AsyncCallback\<void>): void 3643 3644追加待签名数据,通过注册回调函数完成更新。 3645 3646必须在对[Sign](#sign)实例使用[init()](#init-2)初始化后,才能使用本函数。 3647 3648> **说明:** 3649> 3650> 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[sign](#sign-1))或多次调用update。<br/> 3651> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 3652> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 3653> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/> 3654> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 3655 3656**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3657 3658**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3659 3660API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3661 3662**参数:** 3663 3664| 参数名 | 类型 | 必填 | 说明 | 3665| -------- | --------------------- | ---- | ------------ | 3666| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 3667| callback | AsyncCallback\<void> | 是 | 回调函数。当签名更新成功,err为undefined,否则为错误对象。| 3668 3669**错误码:** 3670以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3671 3672| 错误码ID | 错误信息 | 3673| -------- | ---------------------- | 3674| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3675| 17620001 | memory error. | 3676| 17620002 | runtime error. | 3677| 17630001 | crypto operation error. | 3678 3679### update 3680 3681update(data: DataBlob): Promise\<void> 3682 3683追加待签名数据,通过Promise方式完成更新。 3684 3685必须在对[Sign](#sign)实例使用[init()](#init-3)初始化后,才能使用本函数。 3686 3687> **说明:** 3688> 3689> 根据数据量,可以不调用update(即[init](#init-3)完成后直接调用[sign](#sign-2))或多次调用update。<br/> 3690> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 3691> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 3692> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/> 3693> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 3694 3695**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3696 3697**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3698 3699API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3700 3701**参数:** 3702 3703| 参数名 | 类型 | 必填 | 说明 | 3704| ------ | -------- | ---- | ---------- | 3705| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 3706 3707**返回值:** 3708 3709| 类型 | 说明 | 3710| -------------- | ------------- | 3711| Promise\<void> | 无返回结果的Promise对象。 | 3712 3713**错误码:** 3714以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3715 3716| 错误码ID | 错误信息 | 3717| -------- | ---------------------- | 3718| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3719| 17620001 | memory error. | 3720| 17620002 | runtime error. | 3721| 17630001 | crypto operation error. | 3722 3723### updateSync<sup>12+</sup> 3724 3725updateSync(data: DataBlob): void 3726 3727追加待签名数据,通过同步方式完成更新。 3728 3729必须在对[Sign](#sign)实例使用[initSync()](#initsync12-1)初始化后,才能使用本函数。 3730 3731> **说明:** 3732> 3733> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-1)完成后直接调用[signSync](#signsync12))或多次调用updateSync。<br/> 3734> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/> 3735> 签名使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 3736> OnlySign模式下,不支持updateSync操作,需要直接使用signSync传入数据。<br/> 3737> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。 3738 3739**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3740 3741**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3742 3743**参数:** 3744 3745| 参数名 | 类型 | 必填 | 说明 | 3746| ------ | -------- | ---- | ---------- | 3747| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 3748 3749**返回值:** 3750 3751| 类型 | 说明 | 3752| -------------- | ------------- | 3753| void | 无返回结果。 | 3754 3755**错误码:** 3756以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3757 3758| 错误码ID | 错误信息 | 3759| -------- | ---------------------- | 3760| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3761| 17620001 | memory error. | 3762| 17620002 | runtime error. | 3763| 17630001 | crypto operation error. | 3764 3765### sign 3766 3767sign(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void 3768 3769对数据进行签名,通过注册回调函数获取签名结果。 3770 3771**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3772 3773**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3774 3775API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3776 3777**参数:** 3778 3779| 参数名 | 类型 | 必填 | 说明 | 3780| -------- | -------------------- | ---- | ---------- | 3781| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 3782| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 3783 3784**错误码:** 3785以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3786 3787| 错误码ID | 错误信息 | 3788| -------- | ---------------------- | 3789| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3790| 17620001 | memory error. | 3791| 17620002 | runtime error. | 3792| 17630001 | crypto operation error. | 3793 3794### sign 3795 3796sign(data: DataBlob | null): Promise\<DataBlob> 3797 3798对数据进行签名,通过Promise方式返回签名结果。 3799 3800**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3801 3802**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3803 3804API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3805 3806**参数:** 3807 3808| 参数名 | 类型 | 必填 | 说明 | 3809| ------ | -------- | ---- | ---------- | 3810| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。 | 3811 3812**返回值:** 3813 3814| 类型 | 说明 | 3815| -------------- | ------------- | 3816| Promise\<[DataBlob](#datablob)> | 返回签名结果。 | 3817 3818**错误码:** 3819以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3820 3821| 错误码ID | 错误信息 | 3822| -------- | ---------------------- | 3823| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3824| 17620001 | memory error. | 3825| 17620002 | runtime error. | 3826| 17630001 | crypto operation error. | 3827 3828### signSync<sup>12+</sup> 3829 3830signSync(data: DataBlob | null): DataBlob 3831 3832对数据进行签名,通过同步方式返回签名结果。 3833 3834**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3835 3836**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3837 3838**参数:** 3839 3840| 参数名 | 类型 | 必填 | 说明 | 3841| ------ | -------- | ---- | ---------- | 3842| data | [DataBlob](#datablob) \| null | 是 | 传入的消息。 | 3843 3844**返回值:** 3845 3846| 类型 | 说明 | 3847| -------------- | ------------- | 3848| [DataBlob](#datablob) | 返回签名结果。 | 3849 3850**错误码:** 3851以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3852 3853| 错误码ID | 错误信息 | 3854| -------- | ---------------------- | 3855| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3856| 17620001 | memory error. | 3857| 17620002 | runtime error. | 3858| 17630001 | crypto operation error. | 3859 3860**callback示例:** 3861 3862此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 3863 3864```ts 3865import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3866import { buffer } from '@kit.ArkTS'; 3867 3868function signByCallback() { 3869 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 3870 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 3871 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 3872 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 3873 let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData }; 3874 let priKeyBlob: cryptoFramework.DataBlob = { data: skData }; 3875 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 3876 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 3877 rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 3878 signer.init(keyPair.priKey, err => { 3879 signer.update(inputUpdate, err => { 3880 signer.sign(inputVerify, (err, signData) => { 3881 console.info('sign output is ' + signData.data); 3882 }); 3883 }); 3884 }); 3885 }); 3886} 3887``` 3888 3889**Promise示例:** 3890 3891此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 3892 3893```ts 3894import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3895import { buffer } from '@kit.ArkTS'; 3896 3897async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 3898 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 3899 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 3900 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 3901 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 3902 console.info('convertKey success'); 3903 return keyPair; 3904} 3905 3906async function signByPromise() { 3907 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 3908 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 3909 let keyPair = await genKeyPairByData(pkData, skData); 3910 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 3911 let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 3912 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 3913 await signer.init(keyPair.priKey); 3914 await signer.update(inputUpdate); 3915 let signData = await signer.sign(inputSign); 3916 console.info('signData result: ' + signData.data); 3917} 3918``` 3919 3920**Sync示例:** 3921 3922此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 3923 3924```ts 3925import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3926import { buffer } from '@kit.ArkTS'; 3927 3928function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 3929 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 3930 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 3931 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 3932 let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 3933 console.info('convertKeySync success'); 3934 return keyPair; 3935} 3936 3937function signBySync() { 3938 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 3939 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 3940 let keyPair = genKeyPairByData(pkData, skData); 3941 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 3942 let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 3943 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 3944 signer.initSync(keyPair.priKey); 3945 signer.updateSync(inputUpdate); 3946 let signData = signer.signSync(inputSign); 3947 console.info('signData result: ' + signData.data); 3948} 3949``` 3950 3951### setSignSpec<sup>10+</sup> 3952 3953setSignSpec(itemType: SignSpecItem, itemValue: number): void 3954 3955setSignSpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void 3956 3957设置签名参数。常用的签名参数可以直接通过[createSign](#cryptoframeworkcreatesign) 来指定,剩余参数可以通过本接口指定。 3958 3959只支持RSA算法、SM2算法,从API version11开始,支持SM2算法设置签名参数。 3960 3961**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3962 3963**系统能力:** SystemCapability.Security.CryptoFramework.Signature 3964 3965API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 3966 3967**参数:** 3968 3969| 参数名 | 类型 | 必填 | 说明 | 3970| -------- | -------------------- | ---- | ---------- | 3971| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要设置的签名参数。 | 3972| itemValue | number \| Uint8Array<sup>11+</sup> | 是 | 用于指定签名参数的具体值。 | 3973 3974**错误码:** 3975以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3976 3977| 错误码ID | 错误信息 | 3978| -------- | ---------------------- | 3979| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3980| 801 | this operation is not supported. | 3981| 17620001 | memory error. | 3982| 17630001 | crypto operation error. | 3983 3984**示例:** 3985 3986<!--code_no_check--> 3987```ts 3988let signer: cryptoFramework.Sign; // The process of generating the Sign instance is omitted here. 3989let setN = 20; 3990signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN); 3991``` 3992 3993### getSignSpec<sup>10+</sup> 3994 3995getSignSpec(itemType: SignSpecItem): string | number 3996 3997获取签名参数。当前只支持RSA算法。 3998 3999**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4000 4001**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4002 4003API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4004 4005**参数:** 4006 4007| 参数名 | 类型 | 必填 | 说明 | 4008| ------ | -------- | ---- | ---------- | 4009| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要获取的签名参数。 | 4010 4011**返回值:** 4012 4013| 类型 | 说明 | 4014| -------------- | ----------- | 4015| string \| number | 获取的签名参数的具体值。 | 4016 4017**错误码:** 4018以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4019 4020| 错误码ID | 错误信息 | 4021| -------- | ---------------------- | 4022| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4023| 801 | this operation is not supported. | 4024| 17620001 | memory error. | 4025| 17630001 | crypto operation error. | 4026 4027**示例:** 4028 4029<!--code_no_check--> 4030```ts 4031let signer: cryptoFramework.Sign; // The process of generating the Sign instance is omitted here. 4032let saltLen = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM); 4033``` 4034 4035## cryptoFramework.createVerify 4036 4037createVerify(algName: string): Verify 4038 4039Verify实例生成。 4040 4041支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。 4042 4043**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4044 4045**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4046 4047API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4048 4049**参数:** 4050 4051| 参数名 | 类型 | 必填 | 说明 | 4052| ------- | ------ | ---- | ------------------------------------------------------------ | 4053| algName | string | 是 | 指定签名算法:RSA,ECC,DSA,SM2<sup>10+</sup>或ED25519<sup>11+</sup>。使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要。<br/>使用RSA算法验签时,通过设置Recover参数可支持对签名后数据进行验签恢复。 | 4054 4055**返回值**: 4056 4057| 类型 | 说明 | 4058| ------ | ------------------------------------ | 4059| Verify | 返回由输入算法指定生成的Verify对象。 | 4060 4061**错误码:** 4062以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4063 4064| 错误码ID | 错误信息 | 4065| -------- | ---------------------- | 4066| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4067| 801 | this operation is not supported. | 4068| 17620001 | memory error. | 4069 4070**示例:** 4071 4072```ts 4073import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4074 4075let verifyer1 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4076 4077let verifyer2 = cryptoFramework.createVerify('RSA1024|PSS|SHA256|MGF1_SHA256'); 4078 4079let verifyer3 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover'); 4080``` 4081 4082## Verify 4083 4084Verify类,使用Verify方法之前需要创建该类的实例进行操作,通过[createVerify(algName: string): Verify](#cryptoframeworkcreateverify)方法构造此实例。按序调用本类中的init、update、verify方法完成签名操作。验签操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4085 4086Verify类不支持重复初始化,当业务方需要使用新密钥验签时,需要重新创建新Verify对象并调用init初始化。 4087 4088业务方使用时,在createVerify时确定验签的模式,调用init接口设置密钥。 4089 4090当被签名的消息较短时,可在init初始化后,(无需update)直接调用verify接口传入被签名的消息和签名(signatureData)进行验签。 4091 4092当被签名的消息较长时,可通过update接口分段传入被签名的消息,最后调用verify接口对消息全文进行验签。verify接口的data入参在API 10之前只支持DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用verify传入签名(signatureData)进行验签。 4093 4094当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4095 4096### 属性 4097 4098**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4099 4100**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4101 4102API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4103 4104| 名称 | 类型 | 可读 | 可写 | 说明 | 4105| ------- | ------ | ---- | ---- | ---------------------------- | 4106| algName | string | 是 | 否 | 验签指定的算法名称。 | 4107 4108### init 4109 4110init(pubKey: PubKey, callback: AsyncCallback\<void>): void 4111 4112传入公钥初始化Verify对象,通过注册回调函数获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。 4113 4114**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4115 4116**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4117 4118API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4119 4120**参数:** 4121 4122| 参数名 | 类型 | 必填 | 说明 | 4123| -------- | -------------------- | ---- | ------------------------------ | 4124| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4125| callback | AsyncCallback\<void> | 是 | 回调函数。当验签初始化成功,err为undefined,否则为错误对象。 | 4126 4127**错误码:** 4128以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4129 4130| 错误码ID | 错误信息 | 4131| -------- | ---------------------- | 4132| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4133| 17620001 | memory error. | 4134| 17620002 | runtime error. | 4135| 17630001 | crypto operation error. | 4136 4137### init 4138 4139init(pubKey: PubKey): Promise\<void> 4140 4141传入公钥初始化Verify对象,通过Promise获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。 4142 4143**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4144 4145**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4146 4147API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4148 4149**参数:** 4150 4151| 参数名 | 类型 | 必填 | 说明 | 4152| ------ | ---- | ---- | ---------------------------- | 4153| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4154 4155**返回值:** 4156 4157| 类型 | 说明 | 4158| -------------- | ------------- | 4159| Promise\<void> | 无返回结果的Promise对象。 | 4160 4161**错误码:** 4162以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4163 4164| 错误码ID | 错误信息 | 4165| -------- | ---------------------- | 4166| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4167| 17620001 | memory error. | 4168| 17620002 | runtime error. | 4169| 17630001 | crypto operation error. | 4170 4171### initSync<sup>12+</sup> 4172 4173initSync(pubKey: PubKey): void 4174 4175传入公钥初始化Verify对象,通过同步方式获取结果。initSync、updateSync、verifySync为三段式接口,需要成组使用。其中initSync和verifySync必选,updateSync可选。 4176 4177**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4178 4179**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4180 4181**参数:** 4182 4183| 参数名 | 类型 | 必填 | 说明 | 4184| ------ | ---- | ---- | ---------------------------- | 4185| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4186 4187**返回值:** 4188 4189| 类型 | 说明 | 4190| -------------- | ------------- | 4191| void | 无返回结果。 | 4192 4193**错误码:** 4194以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4195 4196| 错误码ID | 错误信息 | 4197| -------- | ---------------------- | 4198| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4199| 17620001 | memory error. | 4200| 17620002 | runtime error. | 4201| 17630001 | crypto operation error. | 4202 4203### update 4204 4205update(data: DataBlob, callback: AsyncCallback\<void>): void 4206 4207追加待验签数据,通过注册回调函数完成更新。 4208 4209必须在对[Verify](#verify)实例使用[init()](#init-4)初始化后,才能使用本函数。 4210 4211> **说明:** 4212> 4213> 根据数据量,可以不调用update(即[init](#init-4)完成后直接调用[verify](#verify-1))或多次调用update。<br/> 4214> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 4215> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4216> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4217 4218**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4219 4220**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4221 4222API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4223 4224**参数:** 4225 4226| 参数名 | 类型 | 必填 | 说明 | 4227| -------- | --------------------- | ---- | ------------ | 4228| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4229| callback | AsyncCallback\<void> | 是 | 回调函数。当验签更新成功,err为undefined,否则为错误对象。| 4230 4231**错误码:** 4232以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4233 4234| 错误码ID | 错误信息 | 4235| -------- | ---------------------- | 4236| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4237| 17620001 | memory error. | 4238| 17620002 | runtime error. | 4239| 17630001 | crypto operation error. | 4240 4241### update 4242 4243update(data: DataBlob): Promise\<void> 4244 4245追加待验签数据,通过Promise方式完成更新。 4246 4247必须在对[Verify](#verify)实例使用[init()](#init-5)初始化后,才能使用本函数。 4248 4249> **说明:** 4250> 4251> 根据数据量,可以不调用update(即[init](#init-5)完成后直接调用[verify](#verify-2))或多次调用update。<br/> 4252> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 4253> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4254> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4255 4256**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4257 4258**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4259 4260API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4261 4262**参数:** 4263 4264| 参数名 | 类型 | 必填 | 说明 | 4265| ------ | -------- | ---- | ---------- | 4266| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4267 4268**返回值:** 4269 4270| 类型 | 说明 | 4271| -------------- | ------------- | 4272| Promise\<void> | 无返回结果的Promise对象。 | 4273 4274**错误码:** 4275以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4276 4277| 错误码ID | 错误信息 | 4278| -------- | ---------------------- | 4279| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4280| 17620001 | memory error. | 4281| 17620002 | runtime error. | 4282| 17630001 | crypto operation error. | 4283 4284### updateSync<sup>12+</sup> 4285 4286updateSync(data: DataBlob): void 4287 4288追加待验签数据,通过同步方式完成更新。 4289 4290必须在对[Verify](#verify)实例使用[initSync()](#initsync12-2)初始化后,才能使用本函数。 4291 4292> **说明:** 4293> 4294> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-2)完成后直接调用[verifySync](#verifysync12))或多次调用updateSync。<br/> 4295> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/> 4296> 验签使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4297> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。 4298 4299**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4300 4301**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4302 4303**参数:** 4304 4305| 参数名 | 类型 | 必填 | 说明 | 4306| ------ | -------- | ---- | ---------- | 4307| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4308 4309**返回值:** 4310 4311| 类型 | 说明 | 4312| -------------- | ------------- | 4313| void | 无返回结果。 | 4314 4315**错误码:** 4316以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4317 4318| 错误码ID | 错误信息 | 4319| -------- | ---------------------- | 4320| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4321| 17620001 | memory error. | 4322| 17620002 | runtime error. | 4323| 17630001 | crypto operation error. | 4324 4325### verify 4326 4327verify(data: DataBlob | null, signatureData: DataBlob, callback: AsyncCallback\<boolean>): void 4328 4329对数据进行验签,通过注册回调函数返回返回验签结果。 4330 4331**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4332 4333**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4334 4335API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4336 4337**参数:** 4338 4339| 参数名 | 类型 | 必填 | 说明 | 4340| ------------- | -------------------- | ---- | ---------- | 4341| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 4342| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4343| callback | AsyncCallback\<boolean> | 是 | 回调函数,用于获取以boolean值表示的验签结果。 | 4344 4345**错误码:** 4346以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4347 4348| 错误码ID | 错误信息 | 4349| -------- | ---------------------- | 4350| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4351| 17620001 | memory error. | 4352| 17620002 | runtime error. | 4353| 17630001 | crypto operation error. | 4354 4355### verify 4356 4357verify(data: DataBlob | null, signatureData: DataBlob): Promise\<boolean> 4358 4359对数据进行验签,通过Promise返回验签结果。 4360 4361**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4362 4363**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4364 4365API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4366 4367**参数:** 4368 4369| 参数名 | 类型 | 必填 | 说明 | 4370| ------------- | -------- | ---- | ---------- | 4371| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 4372| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4373 4374**返回值:** 4375 4376| 类型 | 说明 | 4377| ----------------- | ------------------------------ | 4378| Promise\<boolean> | 异步返回值,代表验签是否通过。 | 4379 4380**错误码:** 4381以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4382 4383| 错误码ID | 错误信息 | 4384| -------- | ---------------------- | 4385| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4386| 17620001 | memory error. | 4387| 17620002 | runtime error. | 4388| 17630001 | crypto operation error. | 4389 4390### verifySync<sup>12+</sup> 4391 4392verifySync(data: DataBlob | null, signatureData: DataBlob): boolean 4393 4394对数据进行验签,通过同步方式返回验签结果。 4395 4396**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4397 4398**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4399 4400**参数:** 4401 4402| 参数名 | 类型 | 必填 | 说明 | 4403| ------------- | -------- | ---- | ---------- | 4404| data | [DataBlob](#datablob) \| null | 是 | 传入的消息。 | 4405| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4406 4407**返回值:** 4408 4409| 类型 | 说明 | 4410| ----------------- | ------------------------------ | 4411| boolean | 同步返回值,代表验签是否通过。 | 4412 4413**错误码:** 4414以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4415 4416| 错误码ID | 错误信息 | 4417| -------- | ---------------------- | 4418| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4419| 17620001 | memory error. | 4420| 17620002 | runtime error. | 4421| 17630001 | crypto operation error. | 4422 4423**callback示例:** 4424 4425此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4426 4427```ts 4428import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4429import { buffer } from '@kit.ArkTS'; 4430 4431function verifyByCallback() { 4432 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4433 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4434 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过 4435 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 4436 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 4437 let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData }; 4438 let priKeyBlob: cryptoFramework.DataBlob = { data: skData }; 4439 // 该数据取自Sign中的signData.data 4440 let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) } 4441 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4442 let verifyer = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4443 rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 4444 verifyer.init(keyPair.pubKey, err => { 4445 verifyer.update(inputUpdate, err => { 4446 verifyer.verify(inputVerify, signMessageBlob, (err, res) => { 4447 console.info('verify result is ' + res); 4448 }); 4449 }); 4450 }); 4451 }); 4452} 4453``` 4454 4455**Promise示例:** 4456 4457此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4458 4459```ts 4460import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4461import { buffer } from '@kit.ArkTS'; 4462 4463async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 4464 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 4465 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 4466 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4467 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 4468 console.info('convertKey success'); 4469 return keyPair; 4470} 4471 4472async function verifyByPromise() { 4473 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过 4474 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 4475 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 4476 let keyPair = await genKeyPairByData(pkData, skData); 4477 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4478 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4479 // 该数据取自Sign中的signData.data 4480 let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) }; 4481 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4482 await verifier.init(keyPair.pubKey); 4483 await verifier.update(inputUpdate); 4484 let res = await verifier.verify(inputVerify, signMessageBlob); 4485 console.info('verify result: ' + res); 4486} 4487``` 4488 4489**Sync示例:** 4490 4491此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4492 4493```ts 4494import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4495import { buffer } from '@kit.ArkTS'; 4496 4497function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 4498 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 4499 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 4500 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4501 let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 4502 console.info('convertKey success'); 4503 return keyPair; 4504} 4505 4506function verifyBySync() { 4507 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过 4508 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 4509 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 4510 let keyPair = genKeyPairByData(pkData, skData); 4511 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4512 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4513 // 该数据取自Sign中的signData.data 4514 let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) }; 4515 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4516 verifier.initSync(keyPair.pubKey); 4517 verifier.updateSync(inputUpdate); 4518 let res = verifier.verifySync(inputVerify, signMessageBlob); 4519 console.info('verify result: ' + res); 4520} 4521``` 4522 4523### recover<sup>12+</sup> 4524 4525recover(signatureData: DataBlob): Promise\<DataBlob | null> 4526 4527对数据进行签名恢复原始数据,通过Promise返回恢复结果。 4528 4529> **说明:** 4530> 4531> - 目前仅RSA支持。 4532 4533**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4534 4535**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4536 4537**参数:** 4538 4539| 参数名 | 类型 | 必填 | 说明 | 4540| ------------- | -------- | ---- | ---------- | 4541| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4542 4543**返回值:** 4544 4545| 类型 | 说明 | 4546| ----------------- | ------------------------------ | 4547| Promise\<[DataBlob](#datablob) \| null> | 验签恢复的数据。 | 4548 4549**错误码:** 4550以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4551 4552| 错误码ID | 错误信息 | 4553| -------- | ---------------------- | 4554| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4555| 17620001 | memory error. | 4556| 17620002 | runtime error. | 4557| 17630001 | crypto operation error. | 4558 4559**示例:** 4560 4561```ts 4562import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4563import { buffer } from '@kit.ArkTS'; 4564 4565async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 4566 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 4567 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 4568 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4569 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 4570 console.info('convertKey success'); 4571 return keyPair; 4572} 4573 4574async function recoverByPromise() { 4575 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过 4576 let pkData = new Uint8Array([48, 129, 159, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 129, 141, 0, 48, 129, 137, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1]); 4577 let skData = new Uint8Array([48, 130, 2, 120, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 2, 98, 48, 130, 2, 94, 2, 1, 0, 2, 129, 129, 0, 214, 179, 23, 198, 183, 139, 148, 8, 173, 74, 56, 160, 15, 248, 244, 166, 209, 250, 142, 74, 216, 58, 117, 215, 178, 247, 254, 39, 180, 227, 85, 201, 59, 133, 209, 221, 26, 9, 116, 31, 172, 151, 252, 185, 123, 20, 25, 7, 92, 129, 5, 196, 239, 214, 126, 254, 154, 188, 239, 144, 161, 171, 65, 42, 31, 214, 93, 115, 247, 69, 94, 143, 54, 51, 25, 49, 146, 204, 205, 165, 20, 120, 35, 184, 190, 65, 106, 12, 214, 176, 57, 125, 235, 51, 88, 135, 76, 73, 109, 112, 147, 138, 198, 252, 5, 20, 245, 51, 7, 32, 108, 89, 125, 204, 50, 189, 88, 254, 255, 146, 244, 244, 149, 79, 54, 216, 45, 89, 2, 3, 1, 0, 1, 2, 129, 129, 0, 152, 111, 145, 203, 10, 88, 116, 163, 112, 126, 9, 20, 68, 34, 235, 121, 98, 14, 182, 102, 151, 125, 114, 91, 210, 122, 215, 29, 212, 5, 176, 203, 238, 146, 5, 190, 41, 21, 91, 56, 125, 239, 111, 133, 53, 200, 192, 56, 132, 202, 42, 145, 120, 3, 224, 40, 223, 46, 148, 29, 41, 92, 17, 40, 12, 72, 165, 69, 192, 211, 142, 233, 81, 202, 177, 235, 156, 27, 179, 48, 18, 85, 154, 101, 193, 45, 218, 91, 24, 143, 196, 248, 16, 83, 177, 198, 136, 77, 111, 134, 60, 219, 95, 246, 23, 5, 45, 14, 83, 29, 137, 248, 159, 28, 132, 142, 205, 99, 226, 213, 84, 232, 57, 130, 156, 81, 191, 237, 2, 65, 0, 255, 158, 212, 13, 43, 132, 244, 135, 148, 161, 232, 219, 20, 81, 196, 102, 103, 44, 110, 71, 100, 62, 73, 200, 32, 138, 114, 209, 171, 150, 179, 92, 198, 5, 190, 218, 79, 227, 227, 37, 32, 57, 159, 252, 107, 211, 139, 198, 202, 248, 137, 143, 186, 205, 106, 81, 85, 207, 134, 148, 110, 204, 243, 27, 2, 65, 0, 215, 4, 181, 121, 57, 224, 170, 168, 183, 159, 152, 8, 74, 233, 80, 244, 146, 81, 48, 159, 194, 199, 36, 187, 6, 181, 182, 223, 115, 133, 151, 171, 78, 219, 90, 161, 248, 69, 6, 207, 173, 3, 81, 161, 2, 60, 238, 204, 177, 12, 138, 17, 220, 179, 71, 113, 200, 248, 159, 153, 252, 150, 180, 155, 2, 65, 0, 190, 202, 185, 211, 170, 171, 238, 40, 84, 84, 21, 13, 144, 57, 7, 178, 183, 71, 126, 120, 98, 229, 235, 4, 40, 229, 173, 149, 185, 209, 29, 199, 29, 54, 164, 161, 38, 8, 30, 62, 83, 179, 47, 42, 165, 0, 156, 207, 160, 39, 169, 229, 81, 180, 136, 170, 116, 182, 20, 233, 45, 90, 100, 9, 2, 65, 0, 152, 255, 47, 198, 15, 201, 238, 133, 89, 11, 133, 153, 184, 252, 37, 239, 177, 65, 118, 80, 231, 190, 222, 66, 250, 118, 72, 166, 221, 67, 156, 245, 119, 138, 28, 6, 142, 107, 71, 122, 116, 200, 156, 199, 237, 152, 191, 239, 4, 184, 64, 114, 143, 81, 62, 48, 23, 233, 217, 95, 47, 221, 104, 171, 2, 64, 30, 219, 1, 230, 241, 70, 246, 243, 121, 174, 67, 66, 11, 99, 202, 17, 52, 234, 78, 29, 3, 57, 51, 123, 149, 86, 64, 192, 73, 199, 108, 101, 55, 232, 41, 114, 153, 237, 253, 52, 205, 148, 45, 86, 186, 241, 182, 183, 42, 77, 252, 195, 29, 158, 173, 3, 182, 207, 254, 61, 71, 184, 167, 184]); 4578 let keyPair = await genKeyPairByData(pkData, skData); 4579 // 该数据取自Sign中的signData.data 4580 let signMessageBlob: cryptoFramework.DataBlob = { data: new Uint8Array([9, 68, 164, 161, 230, 155, 255, 153, 10, 12, 14, 22, 146, 115, 209, 167, 223, 133, 89, 173, 50, 249, 176, 104, 10, 251, 219, 104, 117, 196, 105, 65, 249, 139, 119, 41, 15, 171, 191, 11, 177, 177, 1, 119, 130, 142, 87, 183, 32, 220, 226, 28, 38, 73, 222, 172, 153, 26, 87, 58, 188, 42, 150, 67, 94, 214, 147, 64, 202, 87, 155, 125, 254, 112, 95, 176, 255, 207, 106, 43, 228, 153, 131, 240, 120, 88, 253, 179, 207, 207, 110, 223, 173, 15, 113, 11, 183, 122, 237, 205, 206, 123, 246, 33, 167, 169, 251, 237, 199, 26, 220, 152, 190, 117, 131, 74, 232, 50, 39, 172, 232, 178, 112, 73, 251, 235, 131, 209]) }; 4581 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover'); 4582 await verifier.init(keyPair.pubKey); 4583 try { 4584 let rawSignData = await verifier.recover(signMessageBlob); 4585 if (rawSignData != null) { 4586 console.info('[Promise]: recover result: ' + rawSignData.data); 4587 } else { 4588 console.error("[Promise]: get verify recover result fail!"); 4589 } 4590 } catch (error) { 4591 let e: BusinessError = error as BusinessError; 4592 console.error(`promise error, ${e.code}, ${e.message}`); 4593 } 4594} 4595``` 4596 4597### recoverSync<sup>12+</sup> 4598 4599recoverSync(signatureData: DataBlob): DataBlob | null 4600 4601对数据进行签名恢复原始数据。 4602 4603> **说明:** 4604> 4605> - 目前仅RSA支持。 4606 4607**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4608 4609**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4610 4611**参数:** 4612 4613| 参数名 | 类型 | 必填 | 说明 | 4614| ------------- | -------- | ---- | ---------- | 4615| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 4616 4617**返回值:** 4618 4619| 类型 | 说明 | 4620| ----------------- | ------------------------------ | 4621| [DataBlob](#datablob) \| null | 验签恢复的数据。 | 4622 4623**错误码:** 4624以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4625 4626| 错误码ID | 错误信息 | 4627| -------- | ---------------------- | 4628| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4629| 17620001 | memory error. | 4630| 17620002 | runtime error. | 4631| 17630001 | crypto operation error. | 4632 4633### setVerifySpec<sup>10+</sup> 4634 4635setVerifySpec(itemType: SignSpecItem, itemValue: number): void 4636 4637setVerifySpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void 4638 4639设置验签参数。常用的签名参数可以直接通过[createVerify](#cryptoframeworkcreateverify) 来指定,剩余参数可以通过本接口指定。 4640 4641只支持RSA算法、SM2算法,从API version 11开始,支持SM2算法设置验签参数。 4642 4643验签的参数应当与签名的参数保持一致。 4644 4645**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4646 4647**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4648 4649API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4650 4651**参数:** 4652 4653| 参数名 | 类型 | 必填 | 说明 | 4654| -------- | -------------------- | ---- | ---------- | 4655| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要设置的验签参数。 | 4656| itemValue | number \| Uint8Array<sup>11+</sup> | 是 | 用于指定验签参数的具体值。 | 4657 4658**错误码:** 4659以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4660 4661| 错误码ID | 错误信息 | 4662| -------- | ---------------------- | 4663| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4664| 801 | this operation is not supported. | 4665| 17620001 | memory error. | 4666| 17630001 | crypto operation error. | 4667 4668**示例:** 4669 4670<!--code_no_check--> 4671```ts 4672let verifyer: cryptoFramework.Verify; // The process of generating the Verify instance is omitted here. 4673let setN = 20; 4674verifyer.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN); 4675``` 4676 4677### getVerifySpec<sup>10+</sup> 4678 4679getVerifySpec(itemType: SignSpecItem): string | number 4680 4681获取验签参数。当前只支持RSA算法。 4682 4683验签的参数应当与签名的参数保持一致。 4684 4685**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4686 4687**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4688 4689API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Signature 4690 4691**参数:** 4692 4693| 参数名 | 类型 | 必填 | 说明 | 4694| ------ | -------- | ---- | ---------- | 4695| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要获取的验签参数。 | 4696 4697**返回值:** 4698 4699| 类型 | 说明 | 4700| -------------- | ----------- | 4701| string \| number | 获取的验签参数的具体值。 | 4702 4703**错误码:** 4704以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4705 4706| 错误码ID | 错误信息 | 4707| -------- | ---------------------- | 4708| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4709| 801 | this operation is not supported. | 4710| 17620001 | memory error. | 4711| 17630001 | crypto operation error. | 4712 4713**示例:** 4714 4715<!--code_no_check--> 4716```ts 4717let verifyer: cryptoFramework.Verify; // The process of generating the Verify instance is omitted here. 4718let saltLen = verifyer.getVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM); 4719``` 4720 4721## cryptoFramework.createKeyAgreement 4722 4723createKeyAgreement(algName: string): KeyAgreement 4724 4725KeyAgreement实例生成。 4726 4727支持的规格详见[密钥协商规格](../../security/CryptoArchitectureKit/crypto-key-agreement-overview.md)。 4728 4729**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4730 4731**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4732 4733API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement 4734 4735**参数:** 4736 4737| 参数名 | 类型 | 必填 | 说明 | 4738| ------- | ------ | ---- | ------------------------------------------------------------ | 4739| algName | string | 是 | 指定密钥协商算法:目前仅支持ECC,从API version 11开始,增加支持X25519和DH。 | 4740 4741**返回值**: 4742 4743| 类型 | 说明 | 4744| ------------ | ------------------------------------------ | 4745| KeyAgreement | 返回由输入算法指定生成的KeyAgreement对象。 | 4746 4747**错误码:** 4748以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4749 4750| 错误码ID | 错误信息 | 4751| -------- | ---------------------- | 4752| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4753| 801 | this operation is not supported. | 4754| 17620001 | memory error. | 4755 4756**示例:** 4757 4758```ts 4759import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4760 4761let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 4762``` 4763 4764## KeyAgreement 4765 4766KeyAgreement类,使用密钥协商方法之前需要创建该类的实例进行操作,通过[createKeyAgreement(algName: string): KeyAgreement](#cryptoframeworkcreatekeyagreement)方法构造此实例。 4767 4768### 属性 4769 4770**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4771 4772**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4773 4774API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement 4775 4776| 名称 | 类型 | 可读 | 可写 | 说明 | 4777| ------- | ------ | ---- | ---- | ---------------------------- | 4778| algName | string | 是 | 否 | 密钥协商指定的算法名称。 | 4779 4780### generateSecret 4781 4782generateSecret(priKey: PriKey, pubKey: PubKey, callback: AsyncCallback\<DataBlob>): void 4783 4784基于传入的私钥与公钥进行密钥协商,通过注册回调函数返回共享密钥。 4785 4786**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4787 4788**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4789 4790API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement 4791 4792**参数:** 4793 4794| 参数名 | 类型 | 必填 | 说明 | 4795| -------- | ------------------------ | ---- | ---------------------- | 4796| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 4797| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 4798| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 异步接受共享密钥的回调。 | 4799 4800**错误码:** 4801以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4802 4803| 错误码ID | 错误信息 | 4804| -------- | ---------------------- | 4805| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4806| 17620001 | memory error. | 4807| 17620002 | runtime error. | 4808| 17630001 | crypto operation error. | 4809 4810### generateSecret 4811 4812generateSecret(priKey: PriKey, pubKey: PubKey): Promise\<DataBlob> 4813 4814基于传入的私钥与公钥进行密钥协商,通过Promise返回共享密钥。 4815 4816**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4817 4818**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4819 4820API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.KeyAgreement 4821 4822**参数:** 4823 4824| 参数名 | 类型 | 必填 | 说明 | 4825| ------ | ------ | ---- | ---------------------- | 4826| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 4827| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 4828 4829**返回值:** 4830 4831| 类型 | 说明 | 4832| ------------------ | -------- | 4833| Promise\<[DataBlob](#datablob)> | 共享密钥。 | 4834 4835**错误码:** 4836以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4837 4838| 错误码ID | 错误信息 | 4839| -------- | ---------------------- | 4840| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4841| 17620001 | memory error. | 4842| 17620002 | runtime error. | 4843| 17630001 | crypto operation error. | 4844 4845### generateSecretSync<sup>12+</sup> 4846 4847generateSecretSync(priKey: PriKey, pubKey: PubKey): DataBlob 4848 4849基于传入的私钥与公钥进行密钥协商,通过同步返回共享密钥。 4850 4851**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4852 4853**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 4854 4855**参数:** 4856 4857| 参数名 | 类型 | 必填 | 说明 | 4858| ------ | ------ | ---- | ---------------------- | 4859| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 4860| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 4861 4862**返回值:** 4863 4864| 类型 | 说明 | 4865| ------------------ | -------- | 4866|[DataBlob](#datablob) | 共享密钥。 | 4867 4868**错误码:** 4869以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4870 4871| 错误码ID | 错误信息 | 4872| -------- | ---------------------- | 4873| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4874| 17620001 | memory error. | 4875| 17620002 | runtime error. | 4876| 17630001 | crypto operation error. | 4877 4878**callback示例:** 4879 4880<!--code_no_check--> 4881```ts 4882import { BusinessError } from '@kit.BasicServicesKit'; 4883 4884let globalKeyPair: cryptoFramework.KeyPair; // globalKeyPair is an asymmetric key object generated by the asymmetric key generator. The generation process is omitted here. 4885let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 4886keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey, (err, secret) => { 4887 if (err) { 4888 console.error("keyAgreement error."); 4889 return; 4890 } 4891 console.info('keyAgreement output is ' + secret.data); 4892}); 4893``` 4894 4895**Promise示例:** 4896 4897<!--code_no_check--> 4898```ts 4899import { BusinessError } from '@kit.BasicServicesKit'; 4900 4901let globalKeyPair: cryptoFramework.KeyPair; // globalKeyPair is an asymmetric key object generated by the asymmetric key generator. The generation process is omitted here. 4902let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 4903let keyAgreementPromise = keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey); 4904keyAgreementPromise.then(secret => { 4905 console.info('keyAgreement output is ' + secret.data); 4906}).catch((error: BusinessError) => { 4907 console.error("keyAgreement error."); 4908}); 4909``` 4910 4911**Sync示例:** 4912 4913<!--code_no_check--> 4914```ts 4915let asyGenerator = cryptoFramework.CreateAsyKeyGenerator("ECC256"); 4916let globalKeyPair = asyGenerator.generateKeyPairSync(); 4917let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 4918let secret = keyAgreement.generateSecretSync(globalKeyPair.priKey, globalKeyPair.pubKey); 4919console.info("[Sync]keyAgreement output is " + secret.data); 4920``` 4921 4922## cryptoFramework.createMd 4923 4924createMd(algName: string): Md 4925 4926生成Md实例,用于进行消息摘要的计算与操作。 4927 4928支持的规格详见[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#支持的算法与规格)。 4929 4930**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4931 4932**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 4933 4934API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 4935 4936**参数:** 4937 4938| 参数名 | 类型 | 必填 | 说明 | 4939| ------- | ------ | ---- | ------------------------------------------------------------ | 4940| algName | string | 是 | 指定摘要算法,支持算法请参考[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#支持的算法与规格)。 | 4941 4942**返回值**: 4943 4944| 类型 | 说明 | 4945| ---- | --------------------------------------- | 4946| Md | 返回由输入算法指定生成的[Md](#md)对象。 | 4947 4948**错误码:** 4949以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4950 4951| 错误码ID | 错误信息 | 4952| -------- | ------------------ | 4953| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4954| 17620001 | memory error. | 4955 4956**示例:** 4957 4958```ts 4959import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4960import { BusinessError } from '@kit.BasicServicesKit'; 4961 4962try { 4963 // Set algName based on the algorithm supported. 4964 let md = cryptoFramework.createMd('SHA256'); 4965} catch (error) { 4966 let e: BusinessError = error as BusinessError; 4967 console.error(`sync error, ${e.code}, ${e.message}`); 4968} 4969``` 4970 4971## Md 4972 4973Md类,调用Md方法可以进行MD(Message Digest)摘要计算。调用前,需要通过[createMd](#cryptoframeworkcreatemd)构造Md实例。 4974 4975### 属性 4976 4977**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4978 4979**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 4980 4981API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 4982 4983| 名称 | 类型 | 可读 | 可写 | 说明 | 4984| ------- | ------ | ---- | ---- | ---------------------- | 4985| algName | string | 是 | 否 | 代表指定的摘要算法名。 | 4986 4987### update 4988 4989update(input: DataBlob, callback: AsyncCallback\<void>): void 4990 4991传入消息进行Md更新计算,通过注册回调函数更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。 4992 4993> **说明:** 4994> 4995> - Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 4996> 4997> - 该接口不支持轻量级智能穿戴。 4998 4999**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5000 5001**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5002 5003API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5004 5005**参数:** 5006 5007| 参数名 | 类型 | 必填 | 说明 | 5008| -------- | --------------------- | ---- | ------------ | 5009| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5010| callback | AsyncCallback\<void> | 是 | 回调函数。当摘要更新成功,err为undefined,否则为错误对象。 | 5011 5012**错误码:** 5013以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5014 5015| 错误码ID | 错误信息 | 5016| -------- | ---------------------- | 5017| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5018| 17630001 | crypto operation error. | 5019 5020### update 5021 5022update(input: DataBlob): Promise\<void> 5023 5024传入消息进行Md更新计算,通过Promise更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。 5025 5026> **说明:** 5027> 5028> - Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 5029> 5030> - 该接口不支持轻量级智能穿戴。 5031 5032**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5033 5034**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5035 5036API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5037 5038| 参数名 | 类型 | 必填 | 说明 | 5039| ------ | -------- | ---- | ------------ | 5040| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5041 5042**返回值:** 5043 5044| 类型 | 说明 | 5045| -------------- | ------------- | 5046| Promise\<void> | 无返回结果的Promise对象。 | 5047 5048**错误码:** 5049以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5050 5051| 错误码ID | 错误信息 | 5052| -------- | ---------------------- | 5053| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5054| 17630001 | crypto operation error. | 5055 5056### updateSync<sup>12+</sup> 5057 5058updateSync(input: DataBlob): void 5059 5060传入消息进行Md更新计算,通过同步方式更新。updateSync和digestSync为两段式接口,需要成组使用。其中digestSync必选,updateSync可选。 5061 5062> **说明:** 5063> 5064> Md算法多次调用updateSync更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 5065 5066**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5067 5068**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5069 5070| 参数名 | 类型 | 必填 | 说明 | 5071| ------ | -------- | ---- | ------------ | 5072| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5073 5074**返回值:** 5075 5076| 类型 | 说明 | 5077| -------------- | ------------- | 5078| void | 无返回结果。 | 5079 5080**错误码:** 5081以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5082 5083| 错误码ID | 错误信息 | 5084| -------- | ---------------------- | 5085| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5086| 17630001 | crypto operation error. | 5087 5088### digest 5089 5090digest(callback: AsyncCallback\<DataBlob>): void 5091 5092通过注册回调函数返回Md的计算结果。 5093 5094> **说明:** 5095> 5096> 该接口不支持轻量级智能穿戴。 5097 5098**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5099 5100**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5101 5102API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5103 5104| 参数名 | 类型 | 必填 | 说明 | 5105| -------- | ------------------------ | ---- | ---------- | 5106| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 5107 5108**错误码:** 5109以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5110 5111| 错误码ID | 错误信息 | 5112| -------- | ---------------------- | 5113| 17620001 | memory error. | 5114| 17630001 | crypto operation error. | 5115 5116**示例:** 5117 5118```ts 5119import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5120import { buffer } from '@kit.ArkTS'; 5121 5122function mdByCallback() { 5123 let md = cryptoFramework.createMd('SHA256'); 5124 md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }, (err,) => { 5125 md.digest((err, digestOutput) => { 5126 console.info('[Callback]: MD result: ' + digestOutput.data); 5127 console.info('[Callback]: MD len: ' + md.getMdLength()); 5128 }); 5129 }); 5130} 5131``` 5132 5133### digest 5134 5135digest(): Promise\<DataBlob> 5136 5137通过Promise返回Md的计算结果。 5138 5139> **说明:** 5140> 5141> 该接口不支持轻量级智能穿戴。 5142 5143**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5144 5145**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5146 5147API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5148 5149**返回值:** 5150 5151| 类型 | 说明 | 5152| ------------------ | ----------- | 5153| Promise\<[DataBlob](#datablob)> | Promise对象。 | 5154 5155**错误码:** 5156以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5157 5158| 错误码ID | 错误信息 | 5159| -------- | ---------------------- | 5160| 17620001 | memory error. | 5161| 17630001 | crypto operation error. | 5162 5163**示例:** 5164 5165```ts 5166import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5167import { buffer } from '@kit.ArkTS'; 5168 5169async function mdByPromise() { 5170 let md = cryptoFramework.createMd('SHA256'); 5171 await md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }); 5172 let mdOutput = await md.digest(); 5173 console.info('[Promise]: MD result: ' + mdOutput.data); 5174 console.info('[Promise]: MD len: ' + md.getMdLength()); 5175} 5176``` 5177 5178### digestSync<sup>12+</sup> 5179 5180digestSync(): DataBlob 5181 5182通过同步方式返回Md的计算结果。 5183 5184**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5185 5186**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5187 5188**返回值:** 5189 5190| 类型 | 说明 | 5191| ------------------ | ----------- | 5192| [DataBlob](#datablob) | 表示生成的Md计算结果。 | 5193 5194**错误码:** 5195以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5196 5197| 错误码ID | 错误信息 | 5198| -------- | ---------------------- | 5199| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5200| 17620001 | memory error. | 5201| 17620002 | runtime error. | 5202| 17630001 | crypto operation error. | 5203 5204**示例:** 5205 5206```ts 5207import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5208import { buffer } from '@kit.ArkTS'; 5209 5210async function mdBySync() { 5211 let md = cryptoFramework.createMd('SHA256'); 5212 md.updateSync({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }); 5213 let mdOutput = md.digestSync(); 5214 console.info('[Sync]: MD result: ' + mdOutput.data); 5215 console.info('[Sync]: MD len: ' + md.getMdLength()); 5216} 5217``` 5218 5219### getMdLength 5220 5221getMdLength(): number 5222 5223获取Md消息摘要长度(字节数)。 5224 5225**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5226 5227**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5228 5229API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.MessageDigest 5230 5231**返回值:** 5232 5233| 类型 | 说明 | 5234| ------ | -------------------------- | 5235| number | 返回md计算结果的字节长度。 | 5236 5237**错误码:** 5238以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5239 5240| 错误码ID | 错误信息 | 5241| -------- | ---------------------- | 5242| 17630001 | crypto operation error. | 5243 5244**示例:** 5245 5246```ts 5247import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5248 5249function getLength() { 5250 let md = cryptoFramework.createMd('SHA256'); 5251 console.info('[Promise]: MD len: ' + md.getMdLength()); 5252} 5253``` 5254 5255## cryptoFramework.createMac 5256 5257createMac(algName: string): Mac 5258 5259生成Mac实例,用于进行消息认证码的计算与操作。 5260 5261支持的规格详见[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac.md#支持的算法与规格)。 5262 5263**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5264 5265**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5266 5267API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5268 5269**参数:** 5270 5271| 参数名 | 类型 | 必填 | 说明 | 5272| ------- | ------ | ---- | ------------------------------------------------------------ | 5273| algName | string | 是 | 指定摘要算法,支持算法请参考[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac.md#支持的算法与规格)。 | 5274 5275**返回值**: 5276 5277| 类型 | 说明 | 5278| ---- | ----------------------------------------- | 5279| Mac | 返回由输入算法指定生成的[Mac](#mac)对象。 | 5280 5281**错误码:** 5282以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5283 5284| 错误码ID | 错误信息 | 5285| -------- | ------------------ | 5286| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5287| 17620001 | memory error. | 5288 5289**示例:** 5290 5291```ts 5292import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5293import { BusinessError } from '@kit.BasicServicesKit'; 5294 5295try { 5296 // Set algName based on the algorithm supported. 5297 let mac = cryptoFramework.createMac('SHA256'); 5298} catch (error) { 5299 let e: BusinessError = error as BusinessError; 5300 console.error(`sync error, ${e.code}, ${e.message}`); 5301} 5302``` 5303 5304## Mac 5305 5306Mac类,调用Mac方法可以进行MAC(Message Authentication Code)加密计算。调用前,需要通过[createMac](#cryptoframeworkcreatemac)构造Mac实例。 5307 5308### 属性 5309 5310**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5311 5312**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5313 5314API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5315 5316| 名称 | 类型 | 可读 | 可写 | 说明 | 5317| ------- | ------ | ---- | ---- | ---------------------- | 5318| algName | string | 是 | 否 | 代表指定的摘要算法名。 | 5319 5320### init 5321 5322init(key: SymKey, callback: AsyncCallback\<void>): void 5323 5324使用对称密钥初始化Mac计算,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 5325 5326 > **说明:** 5327 > 5328 > 建议通过[HMAC密钥生成规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md#hmac)创建对称密钥生成器,调用[generateSymKey](#generatesymkey)随机生成对称密钥或调用[convertKey](#convertkey)传入与密钥规格长度一致的二进制密钥数据生成密钥。<br/>当指定“HMAC”生成对称密钥生成器时,仅支持调用[convertKey](#convertkey)传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据生成密钥。 5329 5330**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5331 5332**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5333 5334API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5335 5336**参数:** 5337 5338| 参数名 | 类型 | 必填 | 说明 | 5339| -------- | -------------------- | ---- | -------------- | 5340| key | [SymKey](#symkey) | 是 | 共享对称密钥。 | 5341| callback | AsyncCallback\<void> | 是 | 回调函数。当HMAC初始化成功,err为undefined,否则为错误对象。 | 5342 5343**错误码:** 5344以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5345 5346| 错误码ID | 错误信息 | 5347| -------- | ---------------------- | 5348| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5349| 17630001 | crypto operation error. | 5350 5351### init 5352 5353init(key: SymKey): Promise\<void> 5354 5355使用对称密钥初始化Mac计算,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 5356 5357**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5358 5359**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5360 5361API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5362 5363**参数:** 5364 5365| 参数名 | 类型 | 必填 | 说明 | 5366| ------ | ------ | ---- | ------------ | 5367| key | [SymKey](#symkey) | 是 | 共享对称密钥。 | 5368 5369**返回值:** 5370 5371| 类型 | 说明 | 5372| -------------- | ------------- | 5373| Promise\<void> | 无返回结果的Promise对象。 | 5374 5375**错误码:** 5376以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5377 5378| 错误码ID | 错误信息 | 5379| -------- | ---------------------- | 5380| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5381| 17630001 | crypto operation error. | 5382 5383### initSync<sup>12+</sup> 5384 5385initSync(key: SymKey): void 5386 5387使用对称密钥初始化Mac计算,通过同步方式获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。 5388 5389**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5390 5391**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5392 5393**参数:** 5394 5395| 参数名 | 类型 | 必填 | 说明 | 5396| ------ | ------ | ---- | ------------ | 5397| key | [SymKey](#symkey) | 是 | 共享对称密钥。 | 5398 5399**返回值:** 5400 5401| 类型 | 说明 | 5402| -------------- | ------------- | 5403| void | 无返回结果。 | 5404 5405**错误码:** 5406以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5407 5408| 错误码ID | 错误信息 | 5409| -------- | ---------------------- | 5410| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5411| 17630001 | crypto operation error. | 5412 5413### update 5414 5415update(input: DataBlob, callback: AsyncCallback\<void>): void 5416 5417传入消息进行Mac更新计算,通过注册回调函数获取结果。 5418 5419> **说明:** 5420> 5421> HMAC算法多次调用update更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5422 5423**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5424 5425**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5426 5427API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5428 5429**参数:** 5430 5431| 参数名 | 类型 | 必填 | 说明 | 5432| -------- | --------------------- | ---- | ------------ | 5433| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5434| callback | AsyncCallback\<void> | 是 | 回调函数。当HMAC更新成功,err为undefined,否则为错误对象。| 5435 5436**错误码:** 5437以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5438 5439| 错误码ID | 错误信息 | 5440| -------- | ---------------------- | 5441| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5442| 17630001 | crypto operation error. | 5443 5444### update 5445 5446update(input: DataBlob): Promise\<void> 5447 5448传入消息进行Mac更新计算,通过Promise获取结果。 5449 5450> **说明:** 5451> 5452> HMAC算法多次调用update更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5453 5454**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5455 5456**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5457 5458API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5459 5460**参数:** 5461 5462| 参数名 | 类型 | 必填 | 说明 | 5463| ------ | -------- | ---- | ---------- | 5464| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5465 5466**返回值:** 5467 5468| 类型 | 说明 | 5469| -------------- | ------------- | 5470| Promise\<void> | 无返回结果的Promise对象。 | 5471 5472**错误码:** 5473以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5474 5475| 错误码ID | 错误信息 | 5476| -------- | ---------------------- | 5477| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5478| 17630001 | crypto operation error. | 5479 5480### updateSync<sup>12+</sup> 5481 5482updateSync(input: DataBlob): void 5483 5484传入消息进行Mac更新计算,通过同步方式获取结果。 5485 5486> **说明:** 5487> 5488> HMAC算法多次调用updateSync更新的代码示例详见开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5489 5490**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5491 5492**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5493 5494**参数:** 5495 5496| 参数名 | 类型 | 必填 | 说明 | 5497| ------ | -------- | ---- | ---------- | 5498| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5499 5500**返回值:** 5501 5502| 类型 | 说明 | 5503| -------------- | ------------- | 5504| void | 无返回结果的对象。 | 5505 5506**错误码:** 5507以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5508 5509| 错误码ID | 错误信息 | 5510| -------- | ---------------------- | 5511| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5512| 17630001 | crypto operation error. | 5513 5514### doFinal 5515 5516doFinal(callback: AsyncCallback\<DataBlob>): void 5517 5518通过注册回调函数返回Mac的计算结果。 5519 5520**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5521 5522**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5523 5524API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5525 5526**参数:** 5527 5528| 参数名 | 类型 | 必填 | 说明 | 5529| -------- | ------------------------ | ---- | -------- | 5530| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 5531 5532**错误码:** 5533以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5534 5535| 错误码ID | 错误信息 | 5536| -------- | ---------------------- | 5537| 17620001 | memory error. | 5538| 17630001 | crypto operation error. | 5539 5540**示例:** 5541 5542此外,更多HMAC的完整示例可参考开发指导中[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5543 5544```ts 5545import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5546import { buffer } from '@kit.ArkTS'; 5547 5548function hmacByCallback() { 5549 let mac = cryptoFramework.createMac('SHA256'); 5550 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 5551 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 5552 symKeyGenerator.convertKey(keyBlob, (err, symKey) => { 5553 mac.init(symKey, (err,) => { 5554 mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }, (err,) => { 5555 mac.doFinal((err, output) => { 5556 console.info('[Callback]: HMAC result: ' + output.data); 5557 console.info('[Callback]: MAC len: ' + mac.getMacLength()); 5558 }); 5559 }); 5560 }); 5561 }); 5562} 5563``` 5564 5565### doFinal 5566 5567doFinal(): Promise\<DataBlob> 5568 5569通过Promise返回Mac的计算结果。 5570 5571**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5572 5573**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5574 5575API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5576 5577**返回值:** 5578 5579| 类型 | 说明 | 5580| ------------------ | ----------- | 5581| Promise\<[DataBlob](#datablob)> | Promise对象。 | 5582 5583**错误码:** 5584以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5585 5586| 错误码ID | 错误信息 | 5587| -------- | ---------------------- | 5588| 17620001 | memory error. | 5589| 17630001 | crypto operation error. | 5590 5591**示例:** 5592 5593此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5594 5595```ts 5596import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5597import { buffer } from '@kit.ArkTS'; 5598 5599async function hmacByPromise() { 5600 let mac = cryptoFramework.createMac('SHA256'); 5601 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 5602 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 5603 let symKey = await symKeyGenerator.convertKey(keyBlob); 5604 await mac.init(symKey); 5605 await mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }); 5606 let macOutput = await mac.doFinal(); 5607 console.info('[Promise]: HMAC result: ' + macOutput.data); 5608 console.info('[Promise]: MAC len: ' + mac.getMacLength()); 5609} 5610``` 5611 5612### doFinalSync<sup>12+</sup> 5613 5614doFinalSync(): DataBlob 5615 5616通过同步方式返回Mac的计算结果。 5617 5618**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5619 5620**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5621 5622**返回值:** 5623 5624| 类型 | 说明 | 5625| ------------------ | ----------- | 5626| [DataBlob](#datablob) | 返回Mac的计算结果。 | 5627 5628**错误码:** 5629以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5630 5631| 错误码ID | 错误信息 | 5632| -------- | ---------------------- | 5633| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5634| 17620001 | memory error. | 5635| 17620002 | runtime error. | 5636| 17630001 | crypto operation error. | 5637 5638**示例:** 5639 5640此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-mac.md#分段hmac)。 5641 5642```ts 5643import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5644import { buffer } from '@kit.ArkTS'; 5645 5646function hmacBySync() { 5647 let mac = cryptoFramework.createMac('SHA256'); 5648 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 5649 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 5650 let symKey = symKeyGenerator.convertKeySync(keyBlob); 5651 mac.initSync(symKey); 5652 mac.updateSync({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }); 5653 let macOutput = mac.doFinalSync(); 5654 console.info('[Sync]: HMAC result: ' + macOutput.data); 5655 console.info('[Sync]: MAC len: ' + mac.getMacLength()); 5656} 5657``` 5658 5659### getMacLength 5660 5661getMacLength(): number 5662 5663获取Mac消息认证码的长度(字节数)。 5664 5665**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5666 5667**系统能力:** SystemCapability.Security.CryptoFramework.Mac 5668 5669API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Mac 5670 5671**返回值:** 5672 5673| 类型 | 说明 | 5674| ------ | --------------------------- | 5675| number | 返回mac计算结果的字节长度。 | 5676 5677**错误码:** 5678以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5679 5680| 错误码ID | 错误信息 | 5681| -------- | ---------------------- | 5682| 17630001 | crypto operation error. | 5683 5684**示例:** 5685 5686<!--code_no_check--> 5687```ts 5688import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5689import { BusinessError } from '@kit.BasicServicesKit'; 5690 5691let mac = cryptoFramework.createMac('SHA256'); 5692console.info('Mac algName is: ' + mac.algName); 5693let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]); 5694let keyBlob: cryptoFramework.DataBlob = { data: keyData }; 5695let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 5696let promiseConvertKey = symKeyGenerator.convertKey(keyBlob); 5697promiseConvertKey.then(symKey => { 5698 let promiseMacInit = mac.init(symKey); 5699 return promiseMacInit; 5700}).then(() => { 5701 let blob: cryptoFramework.DataBlob = { data : new Uint8Array([83])}; 5702 let promiseMacUpdate = mac.update(blob); 5703 return promiseMacUpdate; 5704}).then(() => { 5705 let promiseMacDoFinal = mac.doFinal(); 5706 return promiseMacDoFinal; 5707}).then(macOutput => { 5708 console.info('[Promise]: HMAC result: ' + macOutput.data); 5709 let macLen = mac.getMacLength(); 5710 console.info('MAC len: ' + macLen); 5711}).catch((error: BusinessError) => { 5712 console.error("[Promise]: error: " + error.message); 5713}); 5714``` 5715 5716## cryptoFramework.createRandom 5717 5718createRandom(): Random 5719 5720生成Random实例,用于进行随机数的计算与设置种子。 5721 5722支持的规格详见框架概述[随机数算法规格](../../security/CryptoArchitectureKit/crypto-generate-random-number.md#支持的算法与规格)。 5723 5724**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5725 5726**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5727 5728API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5729 5730**返回值**: 5731 5732| 类型 | 说明 | 5733| ------ | ----------------------------------------------- | 5734| Random | 返回由输入算法指定生成的[Random](#random)对象。 | 5735 5736**错误码:** 5737以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5738 5739| 错误码ID | 错误信息 | 5740| -------- | ------------ | 5741| 17620001 | memory error. | 5742 5743**示例:** 5744 5745```ts 5746import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5747import { BusinessError } from '@kit.BasicServicesKit'; 5748 5749try { 5750 let rand = cryptoFramework.createRandom(); 5751} catch (error) { 5752 let e: BusinessError = error as BusinessError; 5753 console.error(`sync error, ${e.code}, ${e.message}`); 5754} 5755``` 5756 5757## Random 5758 5759Random类,调用Random方法可以进行随机数计算。调用前,需要通过[createRandom](#cryptoframeworkcreaterandom)构造Random实例。 5760 5761### 属性 5762 5763**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5764 5765**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5766 5767API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5768 5769| 名称 | 类型 | 可读 | 可写 | 说明 | 5770| ------- | ------ | ---- | ---- | -------------------- | 5771| algName<sup>10+</sup> | string | 是 | 否 | 代表当前使用的随机数生成算法,目前只支持“CTR_DRBG"。 | 5772 5773### generateRandom 5774 5775generateRandom(len: number, callback: AsyncCallback\<DataBlob>): void 5776 5777异步生成指定长度的随机数,通过注册回调函数返回。 5778 5779> **说明:** 5780> 5781> 该接口不支持轻量级智能穿戴。 5782 5783**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5784 5785**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5786 5787API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5788 5789**参数:** 5790 5791| 参数名 | 类型 | 必填 | 说明 | 5792| -------- | ------------------------ | ---- | -------------------- | 5793| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 5794| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 5795 5796**错误码:** 5797以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5798 5799| 错误码ID | 错误信息 | 5800| -------- | ---------------------- | 5801| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5802| 17620001 | memory error. | 5803| 17630001 | crypto operation error. | 5804 5805**示例:** 5806 5807```ts 5808import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5809 5810let rand = cryptoFramework.createRandom(); 5811rand.generateRandom(12, (err, randData) => { 5812 if (err) { 5813 console.error("[Callback] err: " + err.code); 5814 } else { 5815 console.info('[Callback]: generate random result: ' + randData.data); 5816 } 5817}); 5818``` 5819 5820### generateRandom 5821 5822generateRandom(len: number): Promise\<DataBlob> 5823 5824异步生成指定长度的随机数,通过Promise返回。 5825 5826> **说明:** 5827> 5828> 该接口不支持轻量级智能穿戴。 5829 5830**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5831 5832**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5833 5834API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5835 5836**参数:** 5837 5838| 参数名 | 类型 | 必填 | 说明 | 5839| ------ | ------ | ---- | ------------------------------------------------------ | 5840| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 5841 5842**返回值:** 5843 5844| 类型 | 说明 | 5845| ------------------ | ----------- | 5846| Promise\<[DataBlob](#datablob)> | Promise对象。 | 5847 5848**错误码:** 5849以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5850 5851| 错误码ID | 错误信息 | 5852| -------- | ---------------------- | 5853| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5854| 17620001 | memory error. | 5855| 17630001 | crypto operation error. | 5856 5857**示例:** 5858 5859```ts 5860import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5861import { BusinessError } from '@kit.BasicServicesKit'; 5862 5863let rand = cryptoFramework.createRandom(); 5864let promiseGenerateRand = rand.generateRandom(12); 5865promiseGenerateRand.then(randData => { 5866 console.info('[Promise]: rand result: ' + randData.data); 5867}).catch((error: BusinessError) => { 5868 console.error("[Promise]: error: " + error.message); 5869}); 5870``` 5871 5872### generateRandomSync<sup>10+</sup> 5873 5874generateRandomSync(len: number): DataBlob 5875 5876同步生成指定长度的随机数。 5877 5878**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5879 5880**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5881 5882API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5883 5884**参数:** 5885 5886| 参数名 | 类型 | 必填 | 说明 | 5887| ------ | ------ | ---- | -------------------- | 5888| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 5889 5890**返回值:** 5891 5892| 类型 | 说明 | 5893| ------------------ | ----------- | 5894|[DataBlob](#datablob) | 表示生成的随机数。 | 5895 5896**错误码:** 5897以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5898 5899| 错误码ID | 错误信息 | 5900| -------- | ---------------------- | 5901| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5902| 17620001 | memory error. | 5903| 17630001 | crypto operation error. | 5904 5905**示例:** 5906 5907```ts 5908import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5909import { BusinessError } from '@kit.BasicServicesKit'; 5910 5911let rand = cryptoFramework.createRandom(); 5912try { 5913 let randData = rand.generateRandomSync(12); 5914 if (randData != null) { 5915 console.info('[Sync]: rand result: ' + randData.data); 5916 } else { 5917 console.error("[Sync]: get rand result fail!"); 5918 } 5919} catch (error) { 5920 let e: BusinessError = error as BusinessError; 5921 console.error(`sync error, ${e.code}, ${e.message}`); 5922} 5923``` 5924 5925### setSeed 5926 5927setSeed(seed: DataBlob): void 5928 5929设置指定的种子。 5930 5931**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 5932 5933**系统能力:** SystemCapability.Security.CryptoFramework.Rand 5934 5935API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Rand 5936 5937| 参数名 | 类型 | 必填 | 说明 | 5938| ------ | -------- | ---- | ------------ | 5939| seed | [DataBlob](#datablob) | 是 | 设置的种子。 | 5940 5941**错误码:** 5942以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5943 5944| 错误码ID | 错误信息 | 5945| -------- | ----------------- | 5946| 17620001 | memory error. | 5947 5948**示例:** 5949 5950```ts 5951import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5952import { BusinessError } from '@kit.BasicServicesKit'; 5953 5954let rand = cryptoFramework.createRandom(); 5955rand.generateRandom(12, (err, randData) => { 5956 if (err) { 5957 console.error("[Callback] err: " + err.code); 5958 } else { 5959 console.info('[Callback]: generate random result: ' + randData.data); 5960 try { 5961 rand.setSeed(randData); 5962 } catch (error) { 5963 let e: BusinessError = error as BusinessError; 5964 console.error(`sync error, ${e.code}, ${e.message}`); 5965 } 5966 } 5967}); 5968``` 5969 5970## cryptoFramework.createKdf<sup>11+</sup> 5971 5972createKdf(algName: string): Kdf 5973 5974密钥派生函数(key derivation function)实例生成。<br/>支持的规格详见[密钥派生函数规格](../../security/CryptoArchitectureKit/crypto-key-derivation-overview.md)。 5975 5976**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5977 5978**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 5979 5980API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 5981 5982**参数:** 5983 5984| 参数名 | 类型 | 必填 | 说明 | 5985| ------- | ------ | ---- | --------------------------------- | 5986| algName | string | 是 | 指定密钥派生算法(包含HMAC配套的散列函数):目前支持PBKDF2、HKDF算法,如"PBKDF2\|SHA256", "HKDF\|SHA256"。 | 5987 5988**返回值**: 5989 5990| 类型 | 说明 | 5991| ------------ | ------------------------------------------ | 5992| [Kdf](#kdf11) | 返回由输入算法指定生成的Kdf对象。 | 5993 5994**错误码:** 5995以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5996 5997| 错误码ID | 错误信息 | 5998| -------- | ---------------------- | 5999| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6000| 801 | this operation is not supported. | 6001| 17620001 | memory error. | 6002 6003**示例:** 6004- PBKDF2算法 6005```ts 6006import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6007 6008let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6009``` 6010 6011## Kdf<sup>11+</sup> 6012 6013密钥派生函数(key derivation function)类,使用密钥派生方法之前需要创建该类的实例进行操作,通过createKdf(algName: string): Kdf方法构造此实例。 6014 6015### 属性 6016 6017**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6018 6019**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6020 6021API version11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 6022 6023| 名称 | 类型 | 可读 | 可写 | 说明 | 6024| ------- | ------ | ---- | ---- | ---------------------------- | 6025| algName | string | 是 | 否 | 密钥派生函数的算法名称。 | 6026 6027### generateSecret 6028 6029generateSecret(params: KdfSpec, callback: AsyncCallback\<DataBlob>): void 6030 6031基于传入的密钥派生参数进行密钥派生,通过注册回调函数返回派生得到的密钥。 6032 6033**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6034 6035**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6036 6037API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 6038 6039**参数:** 6040 6041| 参数名 | 类型 | 必填 | 说明 | 6042| -------- | ------------------------ | ---- | ---------------------- | 6043| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 6044| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取派生得到的密钥DataBlob数据。 | 6045 6046**错误码:** 6047以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6048 6049| 错误码ID | 错误信息 | 6050| -------- | ---------------------- | 6051| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6052| 17620001 | memory error. | 6053| 17630001 | crypto operation error. | 6054 6055**示例:** 6056 6057- PBKDF2算法 6058 ```ts 6059 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6060 6061 let spec: cryptoFramework.PBKDF2Spec = { 6062 algName: 'PBKDF2', 6063 password: '123456', 6064 salt: new Uint8Array(16), 6065 iterations: 10000, 6066 keySize: 32 6067 }; 6068 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6069 kdf.generateSecret(spec, (err, secret) => { 6070 if (err) { 6071 console.error("key derivation error."); 6072 return; 6073 } 6074 console.info('key derivation output is ' + secret.data); 6075 }); 6076 ``` 6077 6078- HKDF算法 6079 ```ts 6080 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6081 6082 let spec: cryptoFramework.HKDFSpec = { 6083 algName: 'HKDF', 6084 key: '123456', 6085 salt: new Uint8Array(16), 6086 info: new Uint8Array(16), 6087 keySize: 32 6088 }; 6089 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 6090 kdf.generateSecret(spec, (err, secret) => { 6091 if (err) { 6092 console.error("key derivation error."); 6093 return; 6094 } 6095 console.info('key derivation output is ' + secret.data); 6096 }); 6097 ``` 6098 6099### generateSecret 6100 6101generateSecret(params: KdfSpec): Promise\<DataBlob> 6102 6103基于传入的密钥派生参数进行密钥派生,通过Promise形式返回派生得到的密钥。 6104 6105**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6106 6107**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6108 6109API version9-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Kdf 6110 6111**参数:** 6112 6113| 参数名 | 类型 | 必填 | 说明 | 6114| ------ | ------ | ---- | ---------------------- | 6115| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 6116 6117**返回值:** 6118 6119| 类型 | 说明 | 6120| ------------------ | -------- | 6121| Promise\<[DataBlob](#datablob)> | 回调函数,用于获取派生得到的密钥DataBlob数据。 | 6122 6123**错误码:** 6124以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6125 6126| 错误码ID | 错误信息 | 6127| -------- | ---------------------- | 6128| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6129| 17620001 | memory error. | 6130| 17630001 | crypto operation error. | 6131 6132**示例:** 6133 6134- PBKDF2算法 6135 ```ts 6136 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6137 import { BusinessError } from '@kit.BasicServicesKit'; 6138 6139 let spec: cryptoFramework.PBKDF2Spec = { 6140 algName: 'PBKDF2', 6141 password: '123456', 6142 salt: new Uint8Array(16), 6143 iterations: 10000, 6144 keySize: 32 6145 }; 6146 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6147 let kdfPromise = kdf.generateSecret(spec); 6148 kdfPromise.then(secret => { 6149 console.info('key derivation output is ' + secret.data); 6150 }).catch((error: BusinessError) => { 6151 console.error("key derivation error, " + error.message); 6152 }); 6153 ``` 6154 6155- HKDF算法 6156 ```ts 6157 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6158 import { BusinessError } from '@kit.BasicServicesKit'; 6159 6160 let spec: cryptoFramework.HKDFSpec = { 6161 algName: 'HKDF', 6162 key: '123456', 6163 salt: new Uint8Array(16), 6164 info: new Uint8Array(16), 6165 keySize: 32 6166 }; 6167 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 6168 let kdfPromise = kdf.generateSecret(spec); 6169 kdfPromise.then(secret => { 6170 console.info('key derivation output is ' + secret.data); 6171 }).catch((error: BusinessError) => { 6172 console.error("key derivation error, " + error.message); 6173 }); 6174 ``` 6175 6176### generateSecretSync<sup>12+</sup> 6177 6178generateSecretSync(params: KdfSpec): DataBlob 6179 6180基于传入的密钥派生参数进行密钥派生,通过同步方式返回派生得到的密钥。 6181 6182**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6183 6184**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6185 6186**参数:** 6187 6188| 参数名 | 类型 | 必填 | 说明 | 6189| ------ | ------ | ---- | ---------------------- | 6190| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 6191 6192**返回值:** 6193 6194| 类型 | 说明 | 6195| ------------------ | -------- | 6196| [DataBlob](#datablob) | 用于获取派生得到的密钥DataBlob数据。 | 6197 6198**错误码:** 6199以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6200 6201| 错误码ID | 错误信息 | 6202| -------- | ---------------------- | 6203| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 6204| 17620001 | memory error. | 6205| 17620002 | runtime error. | 6206| 17630001 | crypto operation error. | 6207 6208**示例:** 6209 6210- PBKDF2算法 6211 ```ts 6212 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6213 6214 let spec: cryptoFramework.PBKDF2Spec = { 6215 algName: 'PBKDF2', 6216 password: '123456', 6217 salt: new Uint8Array(16), 6218 iterations: 10000, 6219 keySize: 32 6220 }; 6221 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6222 let secret = kdf.generateSecretSync(spec); 6223 console.info("[Sync]key derivation output is " + secret.data); 6224 ``` 6225 6226- HKDF算法 6227 ```ts 6228 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6229 6230 let spec: cryptoFramework.HKDFSpec = { 6231 algName: 'HKDF', 6232 key: '123456', 6233 salt: new Uint8Array(16), 6234 info: new Uint8Array(16), 6235 keySize: 32 6236 }; 6237 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 6238 let secret = kdf.generateSecretSync(spec); 6239 console.info("[Sync]key derivation output is " + secret.data); 6240 ```