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