1# @ohos.security.cryptoFramework (加解密算法库框架) 2 3<!--Kit: Crypto Architecture Kit--> 4<!--Subsystem: Security--> 5<!--Owner: @zxz--3--> 6<!--Designer: @lanming--> 7<!--Tester: @PAFT--> 8<!--Adviser: @zengyawen--> 9 10提供统一的密码算法库加解密接口,以屏蔽底层硬件和算法库。 11 12> **说明:** 13> 14> - 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 15 16## 导入模块 17 18```ts 19import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 20``` 21 22## Result 23 24 表示执行结果的枚举。 25 26 **系统能力:** SystemCapability.Security.CryptoFramework 27 28| 名称 | 值 | 说明 | 29| ------------------------------------- | -------- | ---------------------------- | 30| INVALID_PARAMS | 401 | 非法入参。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 31| NOT_SUPPORT | 801 | 操作不支持。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 | 32| ERR_OUT_OF_MEMORY | 17620001 | 内存错误。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 33| ERR_RUNTIME_ERROR | 17620002 | 运行时外部错误。<br>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 | 34| ERR_PARAMETER_CHECK_FAILED<sup>20+</sup> | 17620003 | 表示参数检查失败。<br>**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。 | 35| ERR_CRYPTO_OPERATION | 17630001 | 调用三方算法库API出错。<br>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 36 37## DataBlob 38 39buffer数组,提供blob数据类型。 40 41 **原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 42 43 **系统能力:** SystemCapability.Security.CryptoFramework 44 45| 名称 | 类型 | 只读 | 可选 | 说明 | 46| ---- | ---------- | ---- | ---- | ------ | 47| data | Uint8Array | 否 | 否 | 数据。 | 48 49> **说明:** 50> 51> Uint8Array类型数据表示8位无符号整数的数组。 52 53## ParamsSpec 54 55加解密参数,在进行对称加解密时需要构造其子类对象,并将子类对象传入[init()](#init-1)方法。 56 57适用于需要iv等参数的对称加解密模式(对于无iv等参数的模式如ECB模式,无需构造,在[init()](#init-1)中传入null即可)。 58 59**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 60 61**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 62 63API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 64 65| 名称 | 类型 | 只读 | 可选 | 说明 | 66| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 67| algName | string | 否 | 否 | 指明对称加解密参数的算法模式。可选值如下:<br/> - "IvParamsSpec":适用于CBC\|CTR\|OFB\|CFB模式。<br/> - "GcmParamsSpec":适用于GCM模式。<br/> - "CcmParamsSpec":适用于CCM模式。 | 68 69> **说明:** 70> 71> 由于[init()](#init-1)的params参数是ParamsSpec类型(父类),而实际需要传入具体的子类对象(如IvParamsSpec),因此在构造子类对象时应设置其父类ParamsSpec的algName参数,使算法库在init()时知道传入的是哪种子类对象。 72 73## IvParamsSpec 74 75加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-1)方法的参数。 76 77适用于CBC、CTR、OFB、CFB这些需要iv作为参数的加解密模式。 78 79**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 80 81**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 82 83API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 84 85| 名称 | 类型 | 只读 | 可选 | 说明 | 86| ---- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 87| 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字节。 | 88 89> **说明:** 90> 91> 传入[init()](#init-1)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 92 93## GcmParamsSpec 94 95加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-1)方法的参数。 96 97适用于GCM模式。 98 99**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 100 101**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 102 103API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 104 105| 名称 | 类型 | 只读 | 可选 | 说明 | 106| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 107| iv | [DataBlob](#datablob) | 否 | 否 | 指明加解密参数iv,长度为1~16字节,常用为12字节。 | 108| aad | [DataBlob](#datablob) | 否 | 否 | 指明加解密参数aad,长度为0~INT_MAX字节,常用为16字节。 | 109| authTag | [DataBlob](#datablob) | 否 | 否 | 指明加解密参数authTag,长度为16字节。<br/>采用GCM模式加密时,需从[doFinal()](#dofinal)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob)中提取末尾16字节,作为[init()](#init-1)或[initSync()](#initsync12)方法中GcmParamsSpec的authTag。 | 110 111> **说明:** 112> 113> 1. 传入[init()](#init-1)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 114> 2. 对于1~16字节长度的iv,加解密算法库无额外限制,但结果取决于底层openssl的支持情况。 115> 3. 当aad参数不需要使用或aad长度为0时,可以将aad的data属性设置为一个空的Uint8Array,来构造GcmParamsSpec,写法为aad: { data: new Uint8Array() }。 116 117## CcmParamsSpec 118 119加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-1)方法的参数。 120 121适用于CCM模式。 122 123**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 124 125**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 126 127API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 128 129| 名称 | 类型 | 只读 | 可选 | 说明 | 130| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ | 131| iv | [DataBlob](#datablob) | 否 | 否 | 指明加解密参数iv,长度为7字节。 | 132| aad | [DataBlob](#datablob) | 否 | 否 | 指明加解密参数aad,长度为8字节。 | 133| authTag | [DataBlob](#datablob) | 否 | 否 | 指定加解密参数authTag,长度为12字节。<br/>在CCM模式加密时,需从[doFinal()](#dofinal)或[doFinalSync()](#dofinalsync12)输出的[DataBlob](#datablob)末尾提取12字节,作为[init()](#init-1)或[initSync()](#initsync12)方法的参数[CcmParamsSpec](#ccmparamsspec)中的authTag。 | 134 135> **说明:** 136> 137> 传入[init()](#init-1)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。 138 139## CryptoMode 140 141表示加解密操作的枚举。 142 143**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 144 145**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 146 147API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 148 149| 名称 | 值 | 说明 | 150| ------------ | ---- | ------------------ | 151| ENCRYPT_MODE | 0 | 表示进行加密操作。 | 152| DECRYPT_MODE | 1 | 表示进行解密操作。 | 153 154## AsyKeySpecItem<sup>10+</sup> 155 156表示密钥参数的枚举。 157 158**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 159 160**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 161 162API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 163 164| 名称 | 值 | 说明 | 165| ------------ | ---- | ---------------- | 166| DSA_P_BN | 101 | DSA算法的素模数p。 | 167| DSA_Q_BN | 102 | DSA算法中密钥参数q(p-1的素因子)。 | 168| DSA_G_BN | 103 | DSA算法的参数g。 | 169| DSA_SK_BN | 104 | DSA算法的私钥sk。 | 170| DSA_PK_BN | 105 | DSA算法的公钥pk。 | 171| ECC_FP_P_BN | 201 | ECC算法中表示椭圆曲线Fp域的素数p。 | 172| ECC_A_BN | 202 | ECC算法中椭圆曲线的第一个系数a。 | 173| ECC_B_BN | 203 | ECC算法中椭圆曲线的第二个系数b。 | 174| ECC_G_X_BN | 204 | ECC算法中基点g的x坐标。 | 175| ECC_G_Y_BN | 205 | ECC算法中基点g的y坐标。 | 176| ECC_N_BN | 206 | ECC算法中基点g的阶n。 | 177| ECC_H_NUM | 207 | ECC算法中的余因子h。 | 178| ECC_SK_BN | 208 | ECC算法中的私钥sk。 | 179| ECC_PK_X_BN | 209 | ECC算法中,公钥pk(椭圆曲线上的一个点)的x坐标。 | 180| ECC_PK_Y_BN | 210 | ECC算法中,公钥pk(椭圆曲线上的一个点)的y坐标。 | 181| ECC_FIELD_TYPE_STR | 211 | ECC算法中,椭圆曲线的域类型(当前只支持Fp域)。 | 182| ECC_FIELD_SIZE_NUM | 212 | ECC算法中域的大小,单位为bits(注:对于Fp域,域的大小为素数p的bits长度)。 | 183| ECC_CURVE_NAME_STR | 213 | ECC算法中的SECG(Standards for Efficient Cryptography Group)曲线名称。 | 184| RSA_N_BN | 301 | RSA算法中的模数n。 | 185| RSA_SK_BN | 302 | RSA算法中的私钥sk(即私钥指数d)。 | 186| RSA_PK_BN | 303 | RSA算法中的公钥pk(即公钥指数e)。 | 187| DH_P_BN<sup>11+</sup> | 401 | DH算法中的素数p。 | 188| DH_G_BN<sup>11+</sup> | 402 | DH算法中的参数g。 | 189| DH_L_NUM<sup>11+</sup> | 403 | DH算法中私钥长度,单位为bit。 | 190| DH_SK_BN<sup>11+</sup> | 404 | DH算法中的私钥sk。 | 191| DH_PK_BN<sup>11+</sup> | 405 | DH算法中的公钥pk。 | 192| ED25519_SK_BN<sup>11+</sup> | 501 | Ed25519算法中的私钥sk。 | 193| ED25519_PK_BN<sup>11+</sup> | 502 | Ed25519算法中的公钥pk。 | 194| X25519_SK_BN<sup>11+</sup> | 601 | X25519算法中的私钥sk。 | 195| X25519_PK_BN<sup>11+</sup> | 602 | X25519算法中的公钥pk。 | 196 197## AsyKeySpecType<sup>10+</sup> 198 199表示密钥参数类型的枚举。 200 201**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 202 203**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 204 205API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 206 207| 名称 | 值 | 说明 | 208| ------------ | ---- | ---------------- | 209| COMMON_PARAMS_SPEC | 0 | 表示公私钥中包含的公共参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair10)随机生成密钥对。 | 210| PRIVATE_KEY_SPEC | 1 | 表示私钥中包含的参数。使用此类型的参数可以调用[generatePriKey](#generateprikey10)生成指定的私钥。 | 211| PUBLIC_KEY_SPEC | 2 | 表示公钥中包含的参数。使用此类型的参数可以调用[generatePubKey](#generatepubkey10)生成指定的公钥。 | 212| KEY_PAIR_SPEC | 3 | 表示公私钥中包含的全量参数。使用此类型的参数可以调用[generateKeyPair](#generatekeypair10)生成指定的密钥对。 | 213 214## CipherSpecItem<sup>10+</sup> 215 216表示加解密参数的枚举。这些参数支持通过[setCipherSpec](#setcipherspec10)接口设置,通过[getCipherSpec](#getcipherspec10)接口获取。 217 218当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_MD_NAME_STR参数的支持,详细规格请参考[加解密规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md)。 219 220**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 221 222**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 223 224API version 10-11 系统能力为 SystemCapability.Security.CryptoFramework;从 API version 12 开始为SystemCapability.Security.CryptoFramework.Cipher 225 226| 名称 | 值 | 说明 | 227| ------------ | ---- | ---------------- | 228| OAEP_MD_NAME_STR | 100 | 表示RSA算法中,使用PKCS1_OAEP模式时,消息摘要功能的算法名。 | 229| OAEP_MGF_NAME_STR | 101 | 表示RSA算法中,使用PKCS1_OAEP模式时,掩码生成算法(目前仅支持MGF1)。 | 230| OAEP_MGF1_MD_STR | 102 | 表示RSA算法中,使用PKCS1_OAEP模式时,MGF1掩码生成功能的消息摘要算法。 | 231| OAEP_MGF1_PSRC_UINT8ARR | 103 | 表示RSA算法中,使用PKCS1_OAEP模式时,pSource的字节流。 | 232| SM2_MD_NAME_STR<sup>11+</sup> | 104 | 表示SM2算法中,使用的摘要算法名。 | 233 234## SignSpecItem<sup>10+</sup> 235 236表示签名验签参数的枚举。这些参数支持通过[setSignSpec](#setsignspec10)、[setVerifySpec](#setverifyspec10)接口设置,通过[getSignSpec](#getsignspec10)、[getVerifySpec](#getverifyspec10)接口获取。 237 238当前只支持RSA算法和SM2算法,从API version 11开始,增加对SM2_USER_ID_UINT8ARR参数的支持,详细规格请参考[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。 239 240**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 241 242**系统能力:** SystemCapability.Security.CryptoFramework.Signature 243 244API version 10-11 系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为 SystemCapability.Security.CryptoFramework.Signature。 245 246| 名称 | 值 | 说明 | 247| ------------ | ---- | ---------------- | 248| PSS_MD_NAME_STR | 100 | 表示RSA算法中,使用PSS模式时,消息摘要功能的算法名。 | 249| PSS_MGF_NAME_STR | 101 | 表示RSA算法中,使用PSS模式时,掩码生成算法(目前仅支持MGF1)。 | 250| PSS_MGF1_MD_STR | 102 | 表示RSA算法中,使用PSS模式时,MGF1掩码生成功能的消息摘要参数。 | 251| PSS_SALT_LEN_NUM | 103 | 表示RSA算法中,使用PSS模式时,盐值的长度,长度以字节为单位。 | 252| PSS_TRAILER_FIELD_NUM | 104 | 表示RSA算法中,使用PSS模式时,用于编码操作的整数。 | 253| SM2_USER_ID_UINT8ARR<sup>11+</sup> | 105 | 表示SM2算法中,用户身份标识字段。 | 254 255## AsyKeySpec<sup>10+</sup> 256 257指定非对称密钥参数的基本接口,用于创建密钥生成器。在指定非对称密钥参数时需要构造其子类对象,并将子类对象传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。构造子类对象时,除了RSA密钥采用小端写法外,其他bigint类型的密钥参数均采用大端写法,并使用正数。 258 259**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 260 261**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 262 263API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 264 265| 名称 | 类型 | 只读 | 可选 | 说明 | 266| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 267| algName | string | 否 | 否 | 指定非对称密钥的算法名称,比如"RSA"、"DSA"、"ECC"、"SM2"、"Ed25519"、"X25519"、"DH"。 | 268| specType | [AsyKeySpecType](#asykeyspectype10) | 否 | 否 | 指定密钥参数类型,用于区分公/私钥参数。 | 269 270## DSACommonParamsSpec<sup>10+</sup> 271 272密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的公共参数,随机生成公/私钥。 273 274在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 275 276**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 277 278**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 279 280API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 281 282| 名称 | 类型 | 只读 | 可选 | 说明 | 283| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 284| p | bigint | 否 | 否 | 指定DSA算法的素模数p。 | 285| q | bigint | 否 | 否 | 指定DSA算法中密钥参数q(p-1的素因子)。 | 286| g | bigint | 否 | 否 | 指定DSA算法的参数g。 | 287 288## DSAPubKeySpec<sup>10+</sup> 289 290密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公钥包含的参数。 291 292在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 293 294**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 295 296**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 297 298API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 299 300| 名称 | 类型 | 只读 | 可选 | 说明 | 301| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 302| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 否 | 否 | 指定DSA算法中公私钥包含的公共参数。 | 303| pk | bigint | 否 | 否 | 指定DSA算法的公钥值。 | 304 305## DSAKeyPairSpec<sup>10+</sup> 306 307密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DSA算法中公私钥包含的全量参数。 308 309在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 310 311**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 312 313**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 314 315API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 316 317| 名称 | 类型 | 只读 | 可选 | 说明 | 318| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 319| params | [DSACommonParamsSpec](#dsacommonparamsspec10) | 否 | 否 | 指定DSA算法中公私钥都包含的公共参数。 | 320| sk | bigint | 否 | 否 | 指定DSA算法的私钥值sk。 | 321| pk | bigint | 否 | 否 | 指定DSA算法的公钥值pk。 | 322 323## ECField<sup>10+</sup> 324 325指定椭圆曲线的域类型。当前只支持Fp域。 326 327**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 328 329**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 330 331API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 332 333| 名称 | 类型 | 只读 | 可选 | 说明 | 334| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 335| fieldType | string | 否 | 否 | 指定椭圆曲线域的类型,当前只支持"Fp"。 | 336 337## ECFieldFp<sup>10+</sup> 338 339指定椭圆曲线的素数域。是[ECField](#ecfield10)的子类。 340 341**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 342 343**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 344 345API version 10-11系统能力为SystemCapability.Security.CryptoFramework。从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 346 347| 名称 | 类型 | 只读 | 可选 | 说明 | 348| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 349| p | bigint | 否 | 否 | 指定素数p的值。 | 350 351## Point<sup>10+</sup> 352 353指定椭圆曲线上的一个点。 354 355**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 356 357**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 358 359API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 360 361| 名称 | 类型 | 只读 | 可选 | 说明 | 362| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 363| x | bigint | 否 | 否 | 指定椭圆曲线上点的x坐标。 | 364| y | bigint | 否 | 否 | 指定椭圆曲线上点的y坐标。 | 365 366## ECCCommonParamsSpec<sup>10+</sup> 367 368密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的公共参数,随机生成公/私钥。 369 370在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 371 372**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 373 374**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 375 376API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 377 378| 名称 | 类型 | 只读 | 可选 | 说明 | 379| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 380| field | [ECField](#ecfield10) | 否 | 否 | 指定椭圆曲线的域(当前只支持Fp域)。 | 381| a | bigint | 否 | 否 | 指定椭圆曲线的第一个系数a。 | 382| b | bigint | 否 | 否 | 指定椭圆曲线的第二个系数b。 | 383| g | [Point](#point10) | 否 | 否 | 指定基点g。 | 384| n | bigint | 否 | 否 | 指定基点g的阶数n。 | 385| h | number | 否 | 否 | 指定余因子h。 | 386 387## ECCPriKeySpec<sup>10+</sup> 388 389密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中私钥包含的参数。 390 391在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 392 393**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 394 395**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 396 397API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 398 399| 名称 | 类型 | 只读 | 可选 | 说明 | 400| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 401| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 否 | 否 | 指定ECC算法中公私钥都包含的公共参数。 | 402| sk | bigint | 否 | 否 | 指定ECC算法的私钥sk。 | 403 404## ECCPubKeySpec<sup>10+</sup> 405 406密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公钥包含的参数。 407 408在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 409 410**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 411 412**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 413 414API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 415 416| 名称 | 类型 | 只读 | 可选 | 说明 | 417| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 418| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 否 | 否 | 指定ECC算法中公私钥都包含的公共参数。 | 419| pk | [Point](#point10) | 否 | 否 | 指定ECC算法的公钥pk。 | 420 421## ECCKeyPairSpec<sup>10+</sup> 422 423密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定ECC算法中公私钥包含的全量参数。 424 425在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 426 427**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 428 429**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 430 431API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 432 433| 名称 | 类型 | 只读 | 可选 | 说明 | 434| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 435| params | [ECCCommonParamsSpec](#ecccommonparamsspec10) | 否 | 否 | 指定ECC算法中公私钥都包含的公共参数。 | 436| sk | bigint | 否 | 否 | 指定ECC算法的私钥sk。 | 437| pk | [Point](#point10) | 否 | 否 | 指定ECC算法的公钥pk。 | 438 439## RSACommonParamsSpec<sup>10+</sup> 440 441密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的公共参数,随机生成公/私钥。 442 443在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 444 445**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 446 447**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 448 449API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 450 451| 名称 | 类型 | 只读 | 可选 | 说明 | 452| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 453| n | bigint | 否 | 否 | 指定模数n。 | 454 455## RSAPubKeySpec<sup>10+</sup> 456 457密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公钥包含的参数。 458 459在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 460 461**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 462 463**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 464 465API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 466 467| 名称 | 类型 | 只读 | 可选 | 说明 | 468| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 469| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 否 | 否 | 指定RSA算法中公私钥都包含的公共参数。 | 470| pk | bigint | 否 | 否 | 指定RSA算法的公钥pk。 | 471 472## RSAKeyPairSpec<sup>10+</sup> 473 474密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定RSA算法中公私钥包含的全量参数。 475 476在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 477 478**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 479 480**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 481 482API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 483 484| 名称 | 类型 | 只读 | 可选 | 说明 | 485| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 486| params | [RSACommonParamsSpec](#rsacommonparamsspec10) | 否 | 否 | 指定RSA算法中公私钥都包含的公共参数。 | 487| sk | bigint | 否 | 否 | 指定RSA算法的私钥sk。 | 488| pk | bigint | 否 | 否 | 指定RSA算法的公钥pk。 | 489 490## ED25519PriKeySpec<sup>11+</sup> 491 492密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定Ed25519算法中私钥包含的参数。 493 494在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 495 496**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 497 498**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 499 500API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 501 502| 名称 | 类型 | 只读 | 可选 | 说明 | 503| ---- | ------ | ---- | ---- | ------------------------- | 504| sk | bigint | 否 | 否 | 指定Ed25519算法的私钥sk。 | 505 506## ED25519PubKeySpec<sup>11+</sup> 507 508密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定Ed25519算法中公钥包含的参数。 509 510在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 511 512**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 513 514**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 515 516API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 517 518| 名称 | 类型 | 只读 | 可选 | 说明 | 519| ---- | ------ | ---- | ---- | ------------------------- | 520| pk | bigint | 否 | 否 | 指定Ed25519算法的公钥pk。 | 521 522## ED25519KeyPairSpec<sup>11+</sup> 523 524密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定Ed25519算法中公私钥包含的全量参数。 525 526在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 527 528**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 529 530**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 531 532API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 533 534| 名称 | 类型 | 只读 | 可选 | 说明 | 535| ---- | ------ | ---- | ---- | ------------------------- | 536| sk | bigint | 否 | 否 | 指定Ed25519算法的私钥sk。 | 537| pk | bigint | 否 | 否 | 指定Ed25519算法的公钥pk。 | 538 539## X25519PriKeySpec<sup>11+</sup> 540 541密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中私钥包含的参数。 542 543在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 544 545**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 546 547**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 548 549API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 550 551| 名称 | 类型 | 只读 | 可选 | 说明 | 552| ---- | ------ | ---- | ---- | ------------------------ | 553| sk | bigint | 否 | 否 | 指定X25519算法的私钥sk。 | 554 555## X25519PubKeySpec<sup>11+</sup> 556 557密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公钥包含的参数。 558 559在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 560 561**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 562 563**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 564 565API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 566 567| 名称 | 类型 | 只读 | 可选 | 说明 | 568| ---- | ------ | ---- | ---- | ------------------------ | 569| pk | bigint | 否 | 否 | 指定X25519算法的公钥pk。 | 570 571## X25519KeyPairSpec<sup>11+</sup> 572 573密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定X25519算法中公私钥包含的全量参数。 574 575在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 576 577**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 578 579**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 580 581API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 582 583| 名称 | 类型 | 只读 | 可选 | 说明 | 584| ---- | ------ | ---- | ---- | ------------------------ | 585| sk | bigint | 否 | 否 | 指定X25519算法的私钥sk。 | 586| pk | bigint | 否 | 否 | 指定X25519算法的公钥pk。 | 587 588## DHCommonParamsSpec<sup>11+</sup> 589 590密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的参数。 591 592在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 593 594**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 595 596**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 597 598API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 599 600| 名称 | 类型 | 只读 | 可选 | 说明 | 601| ---- | ------ | ---- | ---- | ----------------------------------- | 602| p | bigint | 否 | 否 | 指定DH算法中大素数p。 | 603| g | bigint | 否 | 否 | 指定DH算法中参数g。 | 604| l | number | 否 | 否 | 指定DH算法中私钥的长度,单位为bit。 | 605 606## DHPriKeySpec<sup>11+</sup> 607 608密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中私钥包含的参数。 609 610在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 611 612**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 613 614**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 615 616API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 617 618| 名称 | 类型 | 只读 | 可选 | 说明 | 619| ------ | ------------------ | ---- | ---- | ------------------------------------ | 620| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 否 | 否 | 指定DH算法中公私钥都包含的公共参数。 | 621| sk | bigint | 否 | 否 | 指定DH算法的私钥sk。 | 622 623## DHPubKeySpec<sup>11+</sup> 624 625密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公钥包含的参数。 626 627在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 628 629**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 630 631**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 632 633API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 634 635| 名称 | 类型 | 只读 | 可选 | 说明 | 636| ------ | ------------------ | ---- | ---- | ------------------------------------ | 637| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 否 | 否 | 指定DH算法中公私钥都包含的公共参数。 | 638| pk | bigint | 否 | 否 | 指定DH算法的公钥pk。 | 639 640## DHKeyPairSpec<sup>11+</sup> 641 642密钥参数[AsyKeySpec](#asykeyspec10)的子类,用于指定DH算法中公私钥包含的全量参数。 643 644在使用密钥参数生成密钥时,将其传入[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法创建密钥生成器。 645 646**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 647 648**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 649 650API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 651 652| 名称 | 类型 | 只读 | 可选 | 说明 | 653| ------ | ------------------ | ---- | ---- | ------------------------------------ | 654| params | [DHCommonParamsSpec](#dhcommonparamsspec11) | 否 | 否 | 指定DH算法中公私钥都包含的公共参数。 | 655| sk | bigint | 否 | 否 | 指定DH算法的私钥sk。 | 656| pk | bigint | 否 | 否 | 指定DH算法的公钥pk。 | 657 658## KdfSpec<sup>11+</sup> 659 660密钥派生函数参数,使用密钥派生函数进行密钥派生时,需要构建其子类对象并作为输入。 661 662**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 663 664**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 665 666API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf。 667 668| 名称 | 类型 | 只读 | 可选 | 说明 | 669| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 670| algName | string | 否 | 否 | 指明密钥派生函数的算法名,如"PBKDF2"。 | 671 672## PBKDF2Spec<sup>11+</sup> 673 674密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为PBKDF2密钥派生函数进行密钥派生时的输入。 675 676**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 677 678**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 679 680API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf。 681 682| 名称 | 类型 | 只读 | 可选 | 说明 | 683| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 684| password | string \| Uint8Array | 否 | 否 | 用户输入的原始密码。| 685| salt | Uint8Array | 否 | 否 | 盐值。 | 686| iterations | number | 否 | 否 | 迭代次数,需要为正整数。 | 687| keySize | number | 否 | 否 | 派生得到的密钥字节长度。 | 688 689> **说明:** 690> 691> password 是原始密码。如果使用 string 类型,需直接传入用于密钥派生的数据,而不是 HexString 或 base64 等字符串类型,并确保该字符串为 UTF-8 编码,否则派生结果会有差异。 692 693## HKDFSpec<sup>12+</sup> 694 695密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为HKDF密钥派生函数进行密钥派生时的输入。 696 697**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 698 699**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 700 701| 名称 | 类型 | 只读 | 可选 | 说明 | 702| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 703| key | string \| Uint8Array | 否 | 否 | 密钥材料。| 704| salt | Uint8Array | 否 | 否 | 盐值。 | 705| info | Uint8Array | 否 | 否 | 拓展信息。 | 706| keySize | number | 否 | 否 | 派生得到的密钥字节长度。 | 707 708> **说明:** 709> 710> key指的是用户输入的最初的密钥材料。info与salt是可选参数,根据模式的不同可以传空,但是不可不传。 711> 712> 例如:EXTRACT_AND_EXPAND模式需要输入全部的值,EXTRACT_ONLY模式info可以为空,在构建HKDFspec的时候,info传入null值。 713> 714> 默认的模式为EXTRACT_AND_EXPAND,"HKDF|SHA256|EXTRACT_AND_EXPAND"等价于"HKDF|SHA256"。 715 716## ScryptSpec<sup>18+</sup> 717 718密钥派生函数参数[KdfSpec](#kdfspec11)的子类,作为SCRYPT密钥派生函数进行密钥派生时的输入。 719 720**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 721 722**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 723 724| 名称 | 类型 | 只读 | 可选 | 说明 | 725| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 726| passphrase | string \| Uint8Array | 否 | 否 | 用户输入的原始密码。| 727| salt | Uint8Array | 否 | 否 | 盐值。 | 728| n | number | 否 | 否 | 迭代次数,需要为正整数。 | 729| p | number | 否 | 否 | 并行化参数,需要为正整数。 | 730| r | number | 否 | 否 | 块大小参数,需要为正整数。 | 731| maxMemory | number | 否 | 否 | 最大内存限制参数,需要为正整数。 | 732| keySize | number | 否 | 否 | 派生得到的密钥字节长度,需要为正整数。 | 733 734> **说明:** 735> 736> passphrase指的是原始密码,如果使用string类型,需要直接传入用于密钥派生的数据,而不是HexString、base64等字符串类型,同时需要确保该字符串为utf-8编码,否则派生结果会有差异。 737 738## SM2CipherTextSpec<sup>12+</sup> 739 740SM2密文参数,使用SM2密文格式转换函数进行格式转换时,需要用到此对象。可以通过指定此参数,生成符合国密标准的ASN.1格式的SM2密文,反之,也可以从ASN.1格式的SM2密文中获取具体参数。 741 742**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 743 744**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 745 746| 名称 | 类型 | 只读 | 可选 | 说明 | 747| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 748| xCoordinate | bigint | 否 | 否 | x分量。| 749| yCoordinate | bigint | 否 | 否 | y分量。 | 750| cipherTextData | Uint8Array | 否 | 否 | 密文。| 751| hashData | Uint8Array | 否 | 否 | 杂凑值。 | 752 753> **说明:** 754> 755> - hashData为使用SM3算法对明文数据运算得到的杂凑值,其长度固定为256位。 756> 757> - cipherTextData是与明文等长的密文。 758> 759> - 在拼接生成C1C3C2格式的密文时,如果x分量(C1_X)或y分量(C1_Y)的长度不足32字节,需要在高位补0,使得x分量和y分量的长度均为32字节。 760 761## KeyEncodingConfig<sup>18+</sup> 762RSA私钥编码参数,使用获取私钥字符串时,可以添加此参数,生成指定算法、密码的编码后的私钥字符串。 763 764**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 765 766**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 767 768| 名称 | 类型 | 只读 | 可选 | 说明 | 769| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 770| password | string | 否 | 否 | 密码。| 771| cipherName | string | 否 | 否 | 算法名。 | 772 773> **说明:** 774> 775> - password是必选参数,表示编码用到的密码。 776> 777> - cipherName是必选参数,可以指定编码用到的算法。当前仅支持AES-128-CBC、AES-192-CBC、AES-256-CBC、DES-EDE3-CBC。 778 779## MacSpec<sup>18+</sup> 780消息认证码参数,计算HMAC、CMAC消息认证码时,需要构建子类对象并作为输入参数。 781 782**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 783 784**系统能力:** SystemCapability.Security.CryptoFramework.Mac 785 786| 名称 | 类型 | 只读 | 可选 | 说明 | 787| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 788| algName | string | 否 | 否 | 消息验证码算法名。| 789 790> **说明:** 791> 792> algName是必选参数,表示消息验证码算法。 793 794## HmacSpec<sup>18+</sup> 795密钥派生函数参数[MacSpec](#macspec18)的子类,作为HMAC消息验证码计算的输入。 796 797**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 798 799**系统能力:** SystemCapability.Security.CryptoFramework.Mac 800 801| 名称 | 类型 | 只读 | 可选 | 说明 | 802| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 803| mdName | string | 否 | 否 | 摘要算法名。| 804 805> **说明:** 806> 807> mdName是必选参数,表示HMAC摘要算法。 808 809## CmacSpec<sup>18+</sup> 810密钥派生函数参数[MacSpec](#macspec18)的子类,作为CMAC消息验证码计算的输入。 811 812**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 813 814**系统能力:** SystemCapability.Security.CryptoFramework.Mac 815 816| 名称 | 类型 | 只读 | 可选 | 说明 | 817| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 818| cipherName | string | 否 | 否 | 对称加密算法名。 | 819 820> **说明:** 821> 822> cipherName是必选参数,表示CMAC对称加密算法。 823 824## EccSignatureSpec<sup>20+</sup> 825 826包含(r、s)的sm2签名数据的结构体。 827 828> **说明:** 829> 830> r和s的长度各为256位。 831 832**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。 833 834**系统能力:** SystemCapability.Security.CryptoFramework.Signature 835 836| 名称 | 类型 | 只读 | 可选 | 说明 | 837| ------- | ------ | ---- | ---- | ------------------------------------------------------------ | 838| r | bigint | 否 | 否 | r分量。| 839| s | bigint | 否 | 否 | s分量。 | 840 841## Key 842 843密钥(父类),在运行密码算法(如加解密)时需要提前生成其子类对象,并传入[Cipher](#cipher)实例的[init()](#init-1)方法。 844 845密钥可以通过密钥生成器来生成。 846 847### 属性 848 849**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 850 851**系统能力:** SystemCapability.Security.CryptoFramework.Key 852 853API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key。 854 855| 名称 | 类型 | 只读 | 可选 | 说明 | 856| ------- | ------ | ---- | ---- | ---------------------------- | 857| format | string | 是 | 否 | 密钥的格式。 | 858| algName | string | 是 | 否 | 密钥对应的算法名(如果是对称密钥,则含密钥长度,否则不含密钥长度)。 | 859 860### getEncoded 861 862getEncoded(): DataBlob 863 864同步方法,获取密钥数据的字节流。密钥可以是对称密钥、公钥或私钥。公钥格式需符合ASN.1语法、X.509规范和DER编码;私钥格式需符合ASN.1语法、PKCS#8规范和DER编码。 865 866> **说明:** 867> 868> RSA算法使用密钥参数生成私钥时,私钥对象支持getEncoded。 869 870**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 871 872**系统能力:** SystemCapability.Security.CryptoFramework.Key 873 874API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key。 875 876**返回值:** 877 878| 类型 | 说明 | 879| --------------------- | ------------------------ | 880| [DataBlob](#datablob) | 用于查看密钥的具体内容。 | 881 882**错误码:** 883以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 884 885| 错误码ID | 错误信息 | 886| -------- | ---------------------- | 887| 801 | this operation is not supported. | 888| 17620001 | memory operation failed. | 889| 17630001 | crypto operation error. | 890 891**示例:** 892 893```ts 894import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 895 896async function testGenerateAesKey() { 897 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256'); 898 let symKey = await symKeyGenerator.generateSymKey(); 899 let encodedKey = symKey.getEncoded(); 900 console.info('key hex:' + encodedKey.data); 901} 902``` 903 904## SymKey 905 906对称密钥,是[Key](#key)的子类,在对称加解密时需要将其对象传入[Cipher](#cipher)实例的[init()](#init-1)方法使用。 907 908对称密钥可以通过对称密钥生成器[SymKeyGenerator](#symkeygenerator)来生成。 909 910### clearMem 911 912clearMem(): void 913 914同步方法,将系统底层内存中的密钥内容清零。建议在不再使用对称密钥实例时调用此函数,避免密钥数据在内存中存留过久。 915 916**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 917 918**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 919 920API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey。 921 922**示例:** 923 924```ts 925import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 926 927async function testGenerateAesKeyFun() { 928 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256'); 929 let key = await symKeyGenerator.generateSymKey(); 930 let encodedKey = key.getEncoded(); 931 console.info('key blob: '+ encodedKey.data); // Display key content. 932 key.clearMem(); 933 encodedKey = key.getEncoded(); 934 console.info('key blob:' + encodedKey.data); // Display all 0s. 935} 936``` 937 938## PubKey 939 940公钥,是[Key](#key)的子类,在非对称加解密、验签、密钥协商时需要将其对象作为输入使用。 941 942公钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 943 944### getAsyKeySpec<sup>10+</sup> 945 946getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number 947 948同步方法,获取密钥参数。 949 950**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 951 952**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 953 954API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 955 956**参数:** 957 958| 参数名 | 类型 | 必填 | 说明 | 959| ---- | --------------------- | ---- | -------------------- | 960| itemType | [AsyKeySpecItem](#asykeyspecitem10) | 是 | 指定的密钥参数。 | 961 962**返回值:** 963 964| 类型 | 说明 | 965| --------------------------- | --------------------------------- | 966| bigint \| string \| number | 用于查看密钥参数的具体内容。 | 967 968**错误码:** 969以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 970 971| 错误码ID | 错误信息 | 972| -------- | ---------------------- | 973| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 974| 801 | this operation is not supported. | 975| 17620001 | memory operation failed. | 976| 17630001 | crypto operation error. | 977 978**示例:** 979 980```ts 981import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 982 983// 根据关键规范构造EccCommonSpec结构体。EccCommonSpec结构体定义了ECC私钥和公钥的公共参数。 984function genEccCommonSpec(): cryptoFramework.ECCCommonParamsSpec { 985 let fieldFp: cryptoFramework.ECFieldFp = { 986 fieldType: 'Fp', 987 p: BigInt('0xffffffffffffffffffffffffffffffff000000000000000000000001') 988 } 989 let G: cryptoFramework.Point = { 990 x: BigInt('0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21'), 991 y: BigInt('0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34') 992 } 993 let eccCommonSpec: cryptoFramework.ECCCommonParamsSpec = { 994 algName: 'ECC', 995 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 996 field: fieldFp, 997 a: BigInt('0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffe'), 998 b: BigInt('0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4'), 999 g: G, 1000 n: BigInt('0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d'), 1001 h: 1 1002 } 1003 return eccCommonSpec; 1004} 1005 1006async function testgetAsyKeySpec() { 1007 let commKeySpec = genEccCommonSpec(); // 使用参数属性,构造ECC公私钥公共密钥参数对象。 1008 let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(commKeySpec); // 使用密钥参数对象创建生成器。 1009 let keyPair = await generatorBySpec.generateKeyPair(); // Generates an ECC key pair. 1010 let key = keyPair.pubKey; 1011 let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN); 1012 console.info('ecc item --- p: ' + p.toString(16)); 1013} 1014``` 1015 1016### getEncodedDer<sup>12+</sup> 1017 1018getEncodedDer(format: string): DataBlob 1019 1020支持根据指定的密钥格式(如规范、压缩状态等),获取符合ASN.1语法和DER编码的公钥数据。目前仅支持ECC压缩和非压缩格式的公钥数据。 1021 1022> **说明:** 1023> 1024> 本接口和[Key.getEncoded()](#getencoded)的区别是: 1025> 1026> 1. 本接口可根据入参决定数据的输出格式。 1027> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式,生成的数据格式与原始数据格式保持一致。(原始数据格式,指通过[convertKey](#convertkey-3)接口生成密钥对象时的数据格式)。 1028 1029**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1030 1031**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1032 1033**参数:** 1034 1035| 参数名 | 类型 | 必填 | 说明 | 1036| ---- | --------------------- | ---- | -------------------- | 1037| format | string | 是 | 用于指定当前密钥格式,取值仅支持"X509\|COMPRESSED"和"X509\|UNCOMPRESSED"。 | 1038 1039**返回值:** 1040 1041| 类型 | 说明 | 1042| --------------------------- | --------------------------------- | 1043| [DataBlob](#datablob) | 返回满足ASN.1语法和DER编码的指定密钥格式的公钥数据。 | 1044 1045**错误码:** 1046以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 1047 1048| 错误码ID | 错误信息 | 1049| -------- | ---------------------- | 1050| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1051| 17620001 | memory operation failed. | 1052| 17630001 | crypto operation error. | 1053 1054**示例:** 1055 1056```ts 1057import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1058 1059async function testGetEncodedDer() { 1060 let pkData = new Uint8Array([48, 90, 48, 20, 6, 7, 42, 134, 72, 206, 61, 2, 1, 6, 9, 43, 36, 3, 3, 2, 8, 1, 1, 7, 3, 66, 0, 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]); 1061 let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData }; 1062 let generator = cryptoFramework.createAsyKeyGenerator('ECC_BrainPoolP256r1'); 1063 let keyPair = await generator.convertKey(pubKeyBlob, null); 1064 let key = keyPair.pubKey; 1065 let returnBlob = key.getEncodedDer('X509|UNCOMPRESSED'); 1066 console.info('returnBlob data:' + returnBlob.data); 1067} 1068``` 1069 1070### getEncodedPem<sup>12+</sup> 1071 1072getEncodedPem(format: string): string 1073 1074同步方法,获取密钥数据的字符串。密钥可以是RSA公钥或私钥。公钥需符合X.509、PKCS#1规范,并采用PEM编码。 1075 1076**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1077 1078**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1079 1080**参数:** 1081 1082| 参数名 | 类型 | 必填 | 说明 | 1083| ---- | --------------------- | ---- | -------------------- | 1084| format | string | 是 | 指定的获取密钥字符串的编码格式。其中,公钥可为'PKCS1' 或'X509'格式。| 1085 1086**返回值:** 1087 1088| 类型 | 说明 | 1089| --------------------------- | --------------------------------- | 1090| string | 用于获取指定密钥格式的具体内容。 | 1091 1092**错误码:** 1093以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 1094 1095| 错误码ID | 错误信息 | 1096| -------- | ---------------------- | 1097| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1098| 17620001 | memory operation failed. | 1099| 17630001 | crypto operation error. | 1100 1101**示例:** 1102 1103```ts 1104import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1105 1106let publicPkcs1Str1024: string = 1107 "-----BEGIN RSA PUBLIC KEY-----\n" 1108 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 1109 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 1110 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 1111 + "-----END RSA PUBLIC KEY-----\n"; 1112 1113function TestPubKeyPkcs1ToX509BySync1024() { 1114 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 1115 let keyPair = rsaGenerator.convertPemKeySync(publicPkcs1Str1024, null); 1116 let pubPemKey = keyPair.pubKey; 1117 let pubString = pubPemKey.getEncodedPem('X509'); 1118 console.info("[sync]TestPubKeyPkcs1ToX509BySync1024 pubString output is " + pubString); 1119} 1120``` 1121 1122## PriKey 1123 1124私钥,是[Key](#key)的子类,在非对称加解密、签名、密钥协商时需要将其作为输入使用。 1125 1126私钥可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 1127 1128### clearMem 1129 1130clearMem(): void 1131 1132同步方法,清零系统底层内存中的密钥内容。 1133 1134**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1135 1136**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1137 1138API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 1139 1140**示例:** 1141 1142```ts 1143import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1144 1145async function testClearMem() { 1146 let eccGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1147 // 使用密钥生成器随机生成非对称密钥对。 1148 let keyGenPromise = eccGenerator.generateKeyPair(); 1149 keyGenPromise.then(keyPair => { 1150 let priKey = keyPair.priKey; 1151 let returnBlob = priKey.getEncodedDer('PKCS8'); 1152 console.info('returnBlob data:' + returnBlob.data); 1153 priKey.clearMem(); // For the asymmetric private key, clearMem() releases the internal key struct. After clearMem is executed, getEncoded() is not supported. 1154 }); 1155} 1156``` 1157 1158### getAsyKeySpec<sup>10+</sup> 1159 1160getAsyKeySpec(itemType: AsyKeySpecItem): bigint | string | number 1161 1162同步方法,获取密钥参数。 1163 1164**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1165 1166**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1167 1168API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 1169 1170**参数:** 1171 1172| 参数名 | 类型 | 必填 | 说明 | 1173| ---- | --------------------- | ---- | -------------------- | 1174| itemType | [AsyKeySpecItem](#asykeyspecitem10) | 是 | 指定的密钥参数类型。 | 1175 1176**返回值:** 1177 1178| 类型 | 说明 | 1179| --------------------------- | --------------------------------- | 1180| bigint \| string \| number | 用于查看密钥参数的具体内容。 | 1181 1182**错误码:** 1183以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 1184 1185| 错误码ID | 错误信息 | 1186| -------- | ---------------------- | 1187| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1188| 801 | this operation is not supported. | 1189| 17620001 | memory operation failed. | 1190| 17630001 | crypto operation error. | 1191 1192**示例:** 1193 1194```ts 1195// 根据关键规范构造EccCommonSpec结构体。EccCommonSpec结构体定义了ECC私钥和公钥的公共参数。 1196function genEccCommonSpec(): cryptoFramework.ECCCommonParamsSpec { 1197 let fieldFp: cryptoFramework.ECFieldFp = { 1198 fieldType: 'Fp', 1199 p: BigInt('0xffffffffffffffffffffffffffffffff000000000000000000000001') 1200 } 1201 let G: cryptoFramework.Point = { 1202 x: BigInt('0xb70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21'), 1203 y: BigInt('0xbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34') 1204 } 1205 let eccCommonSpec: cryptoFramework.ECCCommonParamsSpec = { 1206 algName: 'ECC', 1207 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 1208 field: fieldFp, 1209 a: BigInt('0xfffffffffffffffffffffffffffffffefffffffffffffffffffffffe'), 1210 b: BigInt('0xb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4'), 1211 g: G, 1212 n: BigInt('0xffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d'), 1213 h: 1 1214 } 1215 return eccCommonSpec; 1216} 1217 1218async function testgetAsyKeySpec() { 1219 let commKeySpec = genEccCommonSpec(); // 使用参数属性,构造ECC公私钥公共密钥参数对象。 1220 let generatorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(commKeySpec); // 使用密钥参数对象创建生成器。 1221 let keyPair = await generatorBySpec.generateKeyPair(); // Generates an ECC key pair. 1222 let key = keyPair.priKey; 1223 let p = key.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_FP_P_BN); 1224 console.info('ecc item --- p: ' + p.toString(16)); 1225} 1226``` 1227### getEncodedDer<sup>12+</sup> 1228 1229getEncodedDer(format: string): DataBlob 1230 1231支持根据指定的密钥格式(如采用哪个规范),获取满足ASN.1语法、DER编码的私钥数据。当前仅支持获取PKCS8格式的ecc私钥数据。 1232 1233> **说明:** 1234> 1235> 本接口和[Key.getEncoded()](#getencoded)的区别是:<br/> 1236> 1. 本接口可根据入参决定数据的输出格式,当前支持获取PKCS8格式的ecc私钥数据。 1237> 2. [Key.getEncoded()](#getencoded)接口,不支持指定密钥格式。 1238 1239**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1240 1241**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1242 1243**参数:** 1244 1245| 参数名 | 类型 | 必填 | 说明 | 1246| ---- | --------------------- | ---- | -------------------- | 1247| format | string | 是 | 用于指定当前密钥格式,取值当前仅支持"PKCS8"。 | 1248 1249**返回值:** 1250 1251| 类型 | 说明 | 1252| --------------------------- | --------------------------------- | 1253| [DataBlob](#datablob) | 返回满足ASN.1语法和DER编码的指定密钥格式的ECC私钥数据。 | 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| 17620001 | memory operation failed. | 1262| 17630001 | crypto operation error. | 1263 1264**示例:** 1265 1266```ts 1267import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1268 1269async function testGetEncodedDer() { 1270 let eccGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1271 // 使用密钥生成器随机生成非对称密钥对。 1272 let keyGenPromise = eccGenerator.generateKeyPair(); 1273 keyGenPromise.then(keyPair => { 1274 let priKey = keyPair.priKey; 1275 let returnBlob = priKey.getEncodedDer('PKCS8'); 1276 console.info('returnBlob data:' + returnBlob.data); 1277 }); 1278} 1279``` 1280 1281### getEncodedPem<sup>12+</sup> 1282 1283getEncodedPem(format: string): string 1284 1285同步方法,获取密钥数据的字符串。密钥可以是RSA公钥或私钥。私钥格式需符合PKCS#8、PKCS#1规范,并采用PEM编码。 1286 1287**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1288 1289**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1290 1291**参数:** 1292 1293| 参数名 | 类型 | 必填 | 说明 | 1294| ---- | --------------------- | ---- | -------------------- | 1295| format | string | 是 | 指定的获取密钥字符串的编码格式。其中,私钥可为'PKCS1' 或'PKCS8'格式。| 1296 1297**返回值:** 1298 1299| 类型 | 说明 | 1300| --------------------------- | --------------------------------- | 1301| string | 用于获取指定密钥格式的具体内容。 | 1302 1303**错误码:** 1304以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。 1305 1306| 错误码ID | 错误信息 | 1307| -------- | ---------------------- | 1308| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1309| 17620001 | memory operation failed. | 1310| 17630001 | crypto operation error. | 1311 1312**示例:** 1313 1314```ts 1315import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1316 1317let priKeyPkcs1Str1024: string = 1318 "-----BEGIN RSA PRIVATE KEY-----\n" 1319 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 1320 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 1321 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 1322 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 1323 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 1324 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 1325 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 1326 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 1327 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 1328 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 1329 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 1330 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 1331 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 1332 + "-----END RSA PRIVATE KEY-----\n"; 1333 1334function TestPriKeyPkcs1ToPkcs8BySync1024() { 1335 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 1336 let keyPair = rsaGenerator.convertPemKeySync(null, priKeyPkcs1Str1024); 1337 let priPemKey = keyPair.priKey; 1338 let priString = priPemKey.getEncodedPem('PKCS8'); 1339 console.info("[sync]TestPriKeyPkcs1ToPkcs8BySync1024 priString output is " + priString); 1340} 1341``` 1342 1343### getEncodedPem<sup>18+</sup> 1344 1345getEncodedPem(format: string, config: KeyEncodingConfig): string 1346 1347同步方法,获取密钥数据的字符串。支持RSA公钥和私钥。私钥格式满足PKCS#8规范、PKCS#1规范和PEM编码方式。 1348 1349**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 1350 1351**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1352 1353**参数:** 1354 1355| 参数名 | 类型 | 必填 | 说明 | 1356| ---- | --------------------- | ---- | -------------------- | 1357| format | string | 是 | 指定的获取密钥字符串的编码格式。其中,私钥可为'PKCS1' 或'PKCS8'格式。| 1358| config | [KeyEncodingConfig](#keyencodingconfig18) | 是 | 指定编码的算法跟口令,对私钥进行编码操作。 | 1359 1360**返回值:** 1361 1362| 类型 | 说明 | 1363| --------------------------- | --------------------------------- | 1364| string | 用于获取指定密钥格式的具体内容。如果填了config参数,则获取编码后的内容。 | 1365 1366**错误码:** 1367以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1368 1369| 错误码ID | 错误信息 | 1370| -------- | ---------------------- | 1371| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1372| 801 | this operation is not supported. | 1373| 17620001 | memory operation failed. | 1374| 17630001 | crypto operation error. | 1375 1376**示例:** 1377 1378```ts 1379import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1380 1381let priKeyPkcs1Str1024: string = 1382 "-----BEGIN RSA PRIVATE KEY-----\n" 1383 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 1384 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 1385 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 1386 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 1387 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 1388 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 1389 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 1390 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 1391 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 1392 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 1393 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 1394 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 1395 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 1396 + "-----END RSA PRIVATE KEY-----\n"; 1397 1398function TestPriKeyPkcs1Encoded() { 1399 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 1400 let keyPair = rsaGenerator.convertPemKeySync(null, priKeyPkcs1Str1024); 1401 let options : cryptoFramework.KeyEncodingConfig = { 1402 password: "123456", 1403 cipherName: "AES-128-CBC" 1404 } 1405 let priPemKey = keyPair.priKey; 1406 let priString = priPemKey.getEncodedPem('PKCS1', options); 1407 console.info("[sync]TestPriKeyPkcs1Encoded priString output is " + priString); 1408} 1409``` 1410 1411## KeyPair 1412 1413非对称密钥对包含公钥和私钥。 1414 1415可以通过非对称密钥生成器[AsyKeyGenerator](#asykeygenerator)、[AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10)来生成。 1416 1417> **说明:** 1418> 1419> KeyPair对象中的pubKey对象和priKey对象是KeyPair对象的成员。当KeyPair对象超出作用域时,其内部的pubKey对象和priKey对象将被析构。 1420> 1421> 业务方使用时应持有KeyPair对象的引用,而非内部pubKey或priKey对象的引用。 1422 1423### 属性 1424 1425**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1426 1427**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1428 1429API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 1430 1431| 名称 | 类型 | 只读 | 可选 | 说明 | 1432| ------- | ------ | ---- | ---- | ------------ | 1433| priKey | [PriKey](#prikey) | 是 | 否 | 私钥。 | 1434| pubKey | [PubKey](#pubkey) | 是 | 否 | 公钥。 | 1435 1436## cryptoFramework.createSymKeyGenerator 1437 1438createSymKeyGenerator(algName: string): SymKeyGenerator 1439 1440通过指定算法名称获取相应的对称密钥生成器实例。 1441 1442支持的规格详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)。 1443 1444**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1445 1446**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1447 1448API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey。 1449 1450**参数:** 1451 1452| 参数名 | 类型 | 必填 | 说明 | 1453| ------- | ------ | ---- | ------------------------------------------------------------ | 1454| algName | string | 是 | 待生成对称密钥生成器的算法名称。<br/>具体取值详见[对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md)一节中的“字符串参数”。 | 1455 1456**返回值:** 1457 1458| 类型 | 说明 | 1459| ----------------------------------- | -------------------------- | 1460| [SymKeyGenerator](#symkeygenerator) | 返回对称密钥生成器的对象。 | 1461 1462**错误码:** 1463以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1464 1465| 错误码ID | 错误信息 | 1466| -------- | ---------------------- | 1467| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1468| 801 | this operation is not supported. | 1469 1470**示例:** 1471 1472```ts 1473import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1474 1475let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1476``` 1477 1478## SymKeyGenerator 1479 1480对称密钥生成器。 1481 1482在使用该类的方法前,先使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)构建SymKeyGenerator实例。 1483 1484### 属性 1485 1486**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1487 1488**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1489 1490API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey。 1491 1492| 名称 | 类型 | 只读 | 可选 | 说明 | 1493| ------- | ------ | ---- | ---- | ------------------------------ | 1494| algName | string | 是 | 否 | 对称密钥生成器指定的算法名称。 | 1495 1496### generateSymKey 1497 1498generateSymKey(callback: AsyncCallback\<SymKey>): void 1499 1500异步获取对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。 1501 1502必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1503 1504目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1505 1506> **说明:** 1507> 1508> 对于HMAC算法的对称密钥,如果在创建对称密钥生成器时指定了具体哈希算法(如“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如256位的密钥数据)。如果未指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKey](#convertkey)方式生成对称密钥数据。 1509 1510**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1511 1512**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1513 1514API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey。 1515 1516**参数:** 1517 1518| 参数名 | 类型 | 必填 | 说明 | 1519| -------- | --------------------------------- | ---- | ------------------------------------------------------------ | 1520| callback | AsyncCallback\<[SymKey](#symkey)> | 是 | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 | 1521 1522**错误码:** 1523以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 1524 1525| 错误码ID | 错误信息 | 1526| -------- | ------------- | 1527| 17620001 | memory operation failed. | 1528 1529**示例:** 1530 1531```ts 1532import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1533 1534let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1535 symKeyGenerator.generateSymKey((err, symKey) => { 1536 console.info('Generate symKey success, algName:' + symKey.algName); 1537 }); 1538``` 1539 1540### generateSymKey 1541 1542generateSymKey(): Promise\<SymKey> 1543 1544异步获取该对称密钥生成器随机生成的密钥,通过Promise获取结果。 1545 1546必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1547 1548目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1549 1550**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1551 1552**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1553 1554API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey。 1555 1556**返回值:** 1557 1558| 类型 | 说明 | 1559| --------------------------- | --------------------------------- | 1560| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 | 1561 1562**错误码:** 1563以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1564 1565| 错误码ID | 错误信息 | 1566| -------- | ------------- | 1567| 17620001 | memory operation failed. | 1568 1569**示例:** 1570 1571```ts 1572import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1573import { BusinessError } from '@kit.BasicServicesKit'; 1574 1575let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 1576 symKeyGenerator.generateSymKey() 1577 .then(symKey => { 1578 console.info('Generate symKey success, algName: ' + symKey.algName); 1579 }).catch((error: BusinessError) => { 1580 console.error(`Generate symKey failed, ${error.code}, ${error.message}`); 1581 }); 1582``` 1583 1584### generateSymKeySync<sup>12+</sup> 1585 1586generateSymKeySync(): SymKey 1587 1588同步获取对称密钥生成器随机生成的密钥。 1589 1590必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1591 1592目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。 1593 1594> **说明:** 1595> 1596> 对于HMAC算法的对称密钥,如果已经在创建对称密钥生成器时指定了具体哈希算法(如指定“HMAC|SHA256”),则会随机生成与哈希长度一致的二进制密钥数据(如指定“HMAC|SHA256”会随机生成256位的密钥数据)。<br/>如果在创建对称密钥生成器时没有指定具体哈希算法,如仅指定“HMAC”,则不支持随机生成对称密钥数据,可通过[convertKeySync](#convertkeysync12)方式生成对称密钥数据。 1597 1598**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1599 1600**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1601 1602**返回值:** 1603 1604| 类型 | 说明 | 1605| --------------------------- | --------------------------------- | 1606| [SymKey](#symkey) | 返回对称密钥SymKey。 | 1607 1608**错误码:** 1609以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1610 1611| 错误码ID | 错误信息 | 1612| -------- | ------------- | 1613| 17620001 | memory operation failed. | 1614 1615**示例:** 1616 1617```ts 1618import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1619 1620function testGenerateSymKeySync() { 1621 // 创建SymKeyGenerator实例。 1622 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256'); 1623 // 使用密钥生成器随机生成对称密钥。 1624 let key = symKeyGenerator.generateSymKeySync(); 1625 let encodedKey = key.getEncoded(); 1626 console.info('key hex:' + encodedKey.data); 1627} 1628``` 1629 1630### convertKey 1631 1632convertKey(key: DataBlob, callback: AsyncCallback\<SymKey>): void 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 1646API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey。 1647 1648**参数:** 1649 1650| 参数名 | 类型 | 必填 | 说明 | 1651| -------- | ------------------- | ---- | ---------------------| 1652| key | [DataBlob](#datablob) | 是 | 指定的对称密钥材料。 | 1653| callback | AsyncCallback\<[SymKey](#symkey)> | 是 | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 | 1654 1655**错误码:** 1656以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 1657 1658| 错误码ID | 错误信息 | 1659| -------- | --------------------------------------------------- | 1660| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1661| 17620001 | memory operation failed. | 1662 1663**示例:** 1664 1665```ts 1666import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1667 1668function genKeyMaterialBlob(): cryptoFramework.DataBlob { 1669 let arr = [ 1670 0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56, 1671 0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c, 1672 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes) 1673 let keyMaterial = new Uint8Array(arr); 1674 return { data: keyMaterial }; 1675} 1676 1677function testConvertKey() { 1678 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1679 let keyMaterialBlob = genKeyMaterialBlob(); 1680 symKeyGenerator.convertKey(keyMaterialBlob, (err, symKey) => { 1681 console.info('Convert symKey success, algName: ' + symKey.algName); 1682 }); 1683} 1684``` 1685 1686### convertKey 1687 1688convertKey(key: DataBlob): Promise\<SymKey> 1689 1690异步根据指定数据生成对称密钥,通过Promise获取结果。 1691 1692在使用本函数前,需先通过[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器。 1693 1694**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1695 1696**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1697 1698API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.SymKey。 1699 1700**参数:** 1701 1702| 参数名 | 类型 | 必填 | 说明 | 1703| ---- | --------------------- | ---- | -------------------- | 1704| key | [DataBlob](#datablob) | 是 | 指定的密钥材料数据。 | 1705 1706**返回值:** 1707 1708| 类型 | 说明 | 1709| --------------------------- | --------------------------------- | 1710| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 | 1711 1712**错误码:** 1713以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 1714 1715| 错误码ID | 错误信息 | 1716| -------- | --------------------------------------------- | 1717| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1718| 17620001 | memory operation failed. | 1719 1720**示例:** 1721 1722```ts 1723import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1724import { BusinessError } from '@kit.BasicServicesKit'; 1725 1726function genKeyMaterialBlob(): cryptoFramework.DataBlob { 1727 let arr = [ 1728 0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56, 1729 0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c, 1730 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes) 1731 let keyMaterial = new Uint8Array(arr); 1732 return { data: keyMaterial }; 1733} 1734 1735function testConvertKey() { 1736 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192'); 1737 let keyMaterialBlob = genKeyMaterialBlob(); 1738 symKeyGenerator.convertKey(keyMaterialBlob) 1739 .then(symKey => { 1740 console.info('Convert symKey success, algName:' + symKey.algName); 1741 }).catch((error: BusinessError) => { 1742 console.error(`Convert symKey failed, ${error.code}, ${error.message}`); 1743 }); 1744} 1745``` 1746 1747### convertKeySync<sup>12+</sup> 1748 1749convertKeySync(key: DataBlob): SymKey 1750 1751同步根据指定数据生成对称密钥。 1752 1753必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。 1754 1755> **说明:** 1756> 1757> 对于HMAC算法的对称密钥,如果在创建对称密钥生成器时指定了具体哈希算法(如“HMAC|SHA256”),则需要传入与哈希长度一致的二进制密钥数据(如SHA256对应的256位密钥数据)。如果在创建对称密钥生成器时未指定具体哈希算法,如仅指定“HMAC”,则支持传入长度在1到4096字节范围内的任意二进制密钥数据。 1758 1759**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1760 1761**系统能力:** SystemCapability.Security.CryptoFramework.Key.SymKey 1762 1763**参数:** 1764 1765| 参数名 | 类型 | 必填 | 说明 | 1766| -------- | ------------------- | ---- | ---------------------| 1767| key | [DataBlob](#datablob) | 是 | 指定的对称密钥材料。 | 1768 1769**返回值:** 1770 1771| 类型 | 说明 | 1772| --------------------------- | --------------------------------- | 1773| [SymKey](#symkey) | 对称密钥。 | 1774 1775**错误码:** 1776以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1777 1778| 错误码ID | 错误信息 | 1779| -------- | --------------------------------------------------- | 1780| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1781| 17620001 | memory operation failed. | 1782 1783**示例:** 1784 1785```ts 1786import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1787import { buffer } from '@kit.ArkTS'; 1788 1789function testConvertKeySync() { 1790 // 对称密钥长度为64字节,512比特。 1791 let keyMessage = '87654321abcdefgh87654321abcdefgh87654321abcdefgh87654321abcdefgh'; 1792 let keyBlob: cryptoFramework.DataBlob = { 1793 data : new Uint8Array(buffer.from(keyMessage, 'utf-8').buffer) 1794 } 1795 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('HMAC'); 1796 let key = symKeyGenerator.convertKeySync(keyBlob); 1797 let encodedKey = key.getEncoded(); 1798 console.info('key encoded data:' + encodedKey.data); 1799} 1800``` 1801 1802## cryptoFramework.createAsyKeyGenerator 1803 1804createAsyKeyGenerator(algName: string): AsyKeyGenerator 1805 1806通过指定算法名称的字符串,获取相应的非对称密钥生成器实例。 1807 1808支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。 1809 1810**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1811 1812**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1813 1814API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 1815 1816**参数:** 1817 1818| 参数名 | 类型 | 必填 | 说明 | 1819| ------- | ------ | ---- | -------------------------------- | 1820| algName | string | 是 | 非对称密钥生成支持的算法名。详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)中的字符串参数。 | 1821 1822**返回值:** 1823 1824| 类型 | 说明 | 1825| --------------- | ---------------------------- | 1826| [AsyKeyGenerator](#asykeygenerator) | 返回非对称密钥生成器。 | 1827 1828**错误码:** 1829以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 1830 1831| 错误码ID | 错误信息 | 1832| -------- | ---------------------- | 1833| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 1834| 801 | this operation is not supported. | 1835| 17620001 | memory operation failed. | 1836 1837**示例:** 1838 1839```ts 1840import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1841 1842let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1843``` 1844 1845## AsyKeyGenerator 1846 1847非对称密钥生成器。在使用该类的方法前,需要先使用createAsyKeyGenerator()方法构建一个AsyKeyGenerator实例。 1848 1849### 属性 1850 1851**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1852 1853**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1854 1855API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 1856 1857| 名称 | 类型 | 只读 | 可选 | 说明 | 1858| ------- | ------ | ---- | ---- | -------------------------------- | 1859| algName | string | 是 | 否 | 非对称密钥生成器指定的算法名称。 | 1860 1861### generateKeyPair 1862 1863generateKeyPair(callback: AsyncCallback\<KeyPair>): void 1864 1865异步获取非对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。 1866 1867**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1868 1869**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1870 1871API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 1872 1873**参数:** 1874 1875| 参数名 | 类型 | 必填 | 说明 | 1876| -------- | ----------------------- | ---- | ------------------------------ | 1877| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 1878 1879**错误码:** 1880以下错误码的详细介绍请参见 [crypto framework错误码](errorcode-crypto-framework.md)。 1881 1882| 错误码ID | 错误信息 | 1883| -------- | ---------------------- | 1884| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types;| 1885| 17620001 | memory operation failed. | 1886| 17630001 | crypto operation error. | 1887 1888**示例:** 1889 1890```ts 1891import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1892 1893let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1894asyKeyGenerator.generateKeyPair((err, keyPair) => { 1895 if (err) { 1896 console.error("generateKeyPair: error."); 1897 return; 1898 } 1899 console.info('generateKeyPair: success.'); 1900}) 1901``` 1902 1903### generateKeyPair 1904 1905generateKeyPair(): Promise\<KeyPair> 1906 1907异步获取非对称密钥生成器随机生成的密钥,通过Promise获取结果。 1908 1909**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1910 1911**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1912 1913API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 1914 1915**返回值:** 1916 1917| 类型 | 说明 | 1918| ----------------- | --------------------------------- | 1919| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 1920 1921**错误码:** 1922以下错误码的详细介绍请参见[crypto framework 错误码](errorcode-crypto-framework.md)。 1923 1924| 错误码ID | 错误信息 | 1925| -------- | ---------------------- | 1926| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1927| 17620001 | memory operation failed. | 1928| 17630001 | crypto operation error. | 1929 1930**示例:** 1931 1932```ts 1933import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1934import { BusinessError } from '@kit.BasicServicesKit'; 1935 1936let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1937let keyGenPromise = asyKeyGenerator.generateKeyPair(); 1938keyGenPromise.then(keyPair => { 1939 console.info('generateKeyPair success.'); 1940}).catch((error: BusinessError) => { 1941 console.error("generateKeyPair error."); 1942}); 1943``` 1944 1945### generateKeyPairSync<sup>12+</sup> 1946 1947generateKeyPairSync(): KeyPair 1948 1949同步获取非对称密钥生成器随机生成的密钥。 1950 1951**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1952 1953**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1954 1955**返回值:** 1956 1957| 类型 | 说明 | 1958| ----------------- | --------------------------------- | 1959| [KeyPair](#keypair) | 非对称密钥。 | 1960 1961**错误码:** 1962以下错误码的详细介绍请参见[crypto framework 错误码](errorcode-crypto-framework.md)。 1963 1964| 错误码ID | 错误信息 | 1965| -------- | ---------------------- | 1966| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 1967| 17620001 | memory operation failed. | 1968| 17630001 | crypto operation error. | 1969 1970**示例:** 1971 1972```ts 1973import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 1974 1975let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 1976try { 1977 let keyPairData = asyKeyGenerator.generateKeyPairSync(); 1978 if (keyPairData != null) { 1979 console.info('[Sync]: key pair success'); 1980 } else { 1981 console.error("[Sync]: get key pair result fail!"); 1982 } 1983} catch (e) { 1984 console.error(`sync error, ${e.code}, ${e.message}`); 1985} 1986``` 1987 1988### convertKey 1989 1990convertKey(pubKey: DataBlob | null, priKey: DataBlob | null, callback: AsyncCallback\<KeyPair\>): void 1991 1992异步获取指定数据生成非对称密钥,通过注册回调函数获取结果。详情请看下方**密钥转换说明**。 1993 1994**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 1995 1996**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 1997 1998API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 1999 2000**参数:** 2001 2002| 参数名 | 类型 | 必填 | 说明 | 2003| -------- | ----------- | ---- | ------------------------------ | 2004| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 2005| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 2006| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 2007 2008**错误码:** 2009以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2010 2011| 错误码ID | 错误信息 | 2012| -------- | ---------------------- | 2013| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2014| 17620001 | memory operation failed. | 2015| 17630001 | crypto operation error. | 2016 2017**示例:** 2018 2019```ts 2020import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2021 2022let 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]); 2023let 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]); 2024let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据。 2025let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据。 2026let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 2027asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 2028 if (err) { 2029 console.error("convertKey: error."); 2030 return; 2031 } 2032 console.info('convertKey: success.'); 2033}); 2034``` 2035 2036### convertKey 2037 2038convertKey(pubKey: DataBlob | null, priKey: DataBlob | null): Promise\<KeyPair> 2039 2040异步获取指定数据生成非对称密钥,通过Promise获取结果。详情请看下方**密钥转换说明**。 2041 2042**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2043 2044**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2045 2046API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 2047 2048**参数:** 2049 2050| 参数名 | 类型 | 必填 | 说明 | 2051| ------ | -------- | ---- | ---------------- | 2052| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 2053| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。API 10之前只支持DataBlob, API 10之后增加支持null。 | 2054 2055**返回值:** 2056 2057| 类型 | 说明 | 2058| ----------------- | --------------------------------- | 2059| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 2060 2061**错误码:** 2062以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2063 2064| 错误码ID | 错误信息 | 2065| -------- | ---------------------- | 2066| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2067| 17620001 | memory operation failed. | 2068| 17630001 | crypto operation error. | 2069 2070**示例:** 2071 2072```ts 2073import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2074import { BusinessError } from '@kit.BasicServicesKit'; 2075 2076let 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]); 2077let 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]); 2078let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据。 2079let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据。 2080let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 2081let keyGenPromise = asyKeyGenerator.convertKey(pubKeyBlob, priKeyBlob); 2082keyGenPromise.then(keyPair => { 2083 console.info('convertKey success.'); 2084}).catch((error: BusinessError) => { 2085 console.error("convertKey error."); 2086}); 2087``` 2088 2089### convertKeySync<sup>12+</sup> 2090 2091convertKeySync(pubKey: DataBlob | null, priKey: DataBlob | null): KeyPair 2092 2093同步获取指定数据生成非对称密钥。详情请看下方**密钥转换说明**。 2094 2095**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2096 2097**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2098 2099**参数:** 2100 2101| 参数名 | 类型 | 必填 | 说明 | 2102| ------ | -------- | ---- | ---------------- | 2103| pubKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定公钥材料。如果公钥无需转换,传入null。API 10前仅支持DataBlob,API 10起支持传入null。 | 2104| priKey | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 指定私钥材料。API 10前仅支持DataBlob,API 10起支持传入null。 | 2105 2106**返回值:** 2107 2108| 类型 | 说明 | 2109| ----------------- | --------------------------------- | 2110| [KeyPair](#keypair) | 非对称密钥。 | 2111 2112**错误码:** 2113以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2114 2115| 错误码ID | 错误信息 | 2116| -------- | ---------------------- | 2117| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2118| 17620001 | memory operation failed. | 2119| 17630001 | crypto operation error. | 2120 2121**示例:** 2122 2123```ts 2124import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2125 2126let 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]); 2127let 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]); 2128let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyArray }; // 公钥二进制数据。 2129let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyArray }; // 私钥二进制数据。 2130let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('ECC256'); 2131try { 2132 let keyPairData = asyKeyGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 2133 if (keyPairData != null) { 2134 console.info('[Sync]: key pair success'); 2135 } else { 2136 console.error("[Sync]: convert key pair result fail!"); 2137 } 2138} catch (e) { 2139 console.error(`sync error, ${e.code}, ${e.message}`); 2140} 2141``` 2142 2143**密钥转换说明** 2144 21451. 非对称密钥(RSA、ECC、DSA)的公钥和私钥调用 getEncoded() 方法后,分别返回 X.509 格式的二进制数据和 PKCS#8 格式的二进制数据。对于 ECC 私钥,返回的是 RFC5915 定义的格式。这些数据可用于跨应用传输或持久化存储。 21462. 当调用convertKey方法将外来二进制数据转换为算法库非对称密钥对象时,公钥应符合ASN.1语法、X.509规范和DER编码格式;私钥应符合ASN.1语法、PKCS#8规范和DER编码格式。 21473. convertKey方法中,公钥和私钥二进制数据非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。 21484. convertKey或convertKeySync方法将外来二进制数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。 2149 2150### convertPemKey<sup>12+</sup> 2151 2152convertPemKey(pubKey: string | null, priKey: string | null): Promise\<KeyPair> 2153 2154异步获取指定数据生成非对称密钥,通过Promise获取结果。 2155 2156> **说明:** 2157> 1. 当调用convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、PEM编码格式,私钥应满足ASN.1语法、PKCS#8规范、PEM编码格式。 2158> 2. convertPemKey方法中,公钥和私钥字符串数据为非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。 2159> 3. convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。 2160 2161**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2162 2163**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2164 2165**参数:** 2166 2167| 参数名 | 类型 | 必填 | 说明 | 2168| ------ | -------- | ---- | ---------------- | 2169| pubKey | string \| null | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。| 2170| priKey | string \| null | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。| 2171 2172**返回值:** 2173 2174| 类型 | 说明 | 2175| ----------------- | --------------------------------- | 2176| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 2177 2178**错误码:** 2179以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2180 2181| 错误码ID | 错误信息 | 2182| -------- | ---------------------- | 2183| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2184| 17620001 | memory operation failed. | 2185| 17630001 | crypto operation error. | 2186 2187**示例:** 2188 2189```ts 2190import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2191import { BusinessError } from '@kit.BasicServicesKit'; 2192 2193let priKeyPkcs1Str1024: string = 2194 "-----BEGIN RSA PRIVATE KEY-----\n" 2195 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 2196 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 2197 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 2198 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 2199 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 2200 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 2201 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 2202 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 2203 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 2204 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 2205 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 2206 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 2207 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 2208 + "-----END RSA PRIVATE KEY-----\n"; 2209let publicPkcs1Str1024: string = 2210 "-----BEGIN RSA PUBLIC KEY-----\n" 2211 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 2212 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 2213 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 2214 + "-----END RSA PUBLIC KEY-----\n"; 2215async function TestConvertPemKeyByPromise() { 2216 let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 2217 asyKeyGenerator.convertPemKey(publicPkcs1Str1024, priKeyPkcs1Str1024) 2218 .then(keyPair => { 2219 console.info('convertPemKey success.'); 2220 }).catch((error: BusinessError) => { 2221 console.error("convertPemKey error."); 2222 }); 2223} 2224``` 2225 2226### convertPemKey<sup>18+</sup> 2227 2228convertPemKey(pubKey: string | null, priKey: string | null, password: string): Promise\<KeyPair> 2229 2230异步获取指定数据生成非对称密钥,通过Promise获取结果。 2231 2232> **说明:** 2233> 1. 当调用convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、PEM编码格式,私钥应满足ASN.1语法、PKCS#8规范、PEM编码格式。 2234> 2. convertPemKey方法中,公钥和私钥字符串数据为非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。 2235> 3. convertPemKey方法将外来字符串数据转换为算法库非对称密钥对象时,不会校验生成的密钥对象的规格与创建非对称密钥生成器时指定的密钥规格是否一致。 2236> 4. password为口令,传入后可以解密加密后的私钥。 2237 2238**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 2239 2240**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2241 2242**参数:** 2243 2244| 参数名 | 类型 | 必填 | 说明 | 2245| ------ | -------- | ---- | ---------------- | 2246| pubKey | string \| null | 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。| 2247| priKey | string \| null | 是 | 指定的私钥材料。如果私钥不需要转换,可直接传入null。注:公钥和私钥材料不能同时为null。| 2248| password | string | 是 | 指定口令,用于解密私钥。| 2249 2250**返回值:** 2251 2252| 类型 | 说明 | 2253| ----------------- | --------------------------------- | 2254| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 2255 2256**错误码:** 2257以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2258 2259| 错误码ID | 错误信息 | 2260| -------- | ---------------------- | 2261| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2262| 17620001 | memory operation failed. | 2263| 17630001 | crypto operation error. | 2264 2265**示例:** 2266 2267```ts 2268import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2269import { BusinessError } from '@kit.BasicServicesKit'; 2270 2271let priKeyPkcs1EncodingStr : string = 2272 "-----BEGIN RSA PRIVATE KEY-----\n" 2273 +"Proc-Type: 4,ENCRYPTED\n" 2274 +"DEK-Info: AES-128-CBC,815A066131BF05CF87CE610A59CC69AE\n\n" 2275 +"7Jd0vmOmYGFZ2yRY8fqRl3+6rQlFtNcMILvcb5KWHDSrxA0ULmJE7CW0DSRikHoA\n" 2276 +"t0KgafhYXeQXh0dRy9lvVRAFSLHCLJVjchx90V7ZSivBFEq7+iTozVp4AlbgYsJP\n" 2277 +"vx/1sfZD2WAcyMJ7IDmJyft7xnpVSXsyWGTT4f3eaHJIh1dqjwrso7ucAW0FK6rp\n" 2278 +"/TONyOoXNfXtRbVtxNyCWBxt4HCSclDZFvS9y8fz9ZwmCUV7jei/YdzyQI2wnE13\n" 2279 +"W8cKlpzRFL6BWi8XPrUtAw5MWeHBAPUgPWMfcmiaeyi5BJFhQCrHLi+Gj4EEJvp7\n" 2280 +"mP5cbnQAx6+paV5z9m71SKrI/WSc4ixsYYdVmlL/qwAK9YliFfoPl030YJWW6rFf\n" 2281 +"T7J9BUlHGUJ0RB2lURNNLakM+UZRkeE9TByzCzgTxuQtyv5Lwsh2mAk3ia5x0kUO\n" 2282 +"LHg3Eoabhdh+YZA5hHaxnpF7VjspB78E0F9Btq+A41rSJ6zDOdToHey4MJ2nxdey\n" 2283 +"Z3bi81TZ6Fp4IuROrvZ2B/Xl3uNKR7n+AHRKnaAO87ywzyltvjwSh2y3xhJueiRs\n" 2284 +"BiYkyL3/fnocD3pexTdN6h3JgQGgO5GV8zw/NrxA85mw8o9im0HreuFObmNj36T9\n" 2285 +"k5N+R/QIXW83cIQOLaWK1ThYcluytf0tDRiMoKqULiaA6HvDMigExLxuhCtnoF8I\n" 2286 +"iOLN1cPdEVQjzwDHLqXP2DbWW1z9iRepLZlEm1hLRLEmOrTGKezYupVv306SSa6J\n" 2287 +"OA55lAeXMbyjFaYCr54HWrpt4NwNBX1efMUURc+1LcHpzFrBTTLbfjIyq6as49pH\n" 2288 +"-----END RSA PRIVATE KEY-----\n" 2289 2290async function TestConvertPemKeyByPromise() { 2291 let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 2292 asyKeyGenerator.convertPemKey(null, priKeyPkcs1EncodingStr, "123456") 2293 .then(keyPair => { 2294 console.info('convertPemKey success.'); 2295 }).catch((error: BusinessError) => { 2296 console.error("convertPemKey error."); 2297 }); 2298} 2299``` 2300 2301### convertPemKeySync<sup>12+</sup> 2302 2303convertPemKeySync(pubKey: string | null, priKey: string | null): KeyPair 2304 2305同步获取指定数据,生成非对称密钥。 2306 2307> **说明:** 2308> convertPemKeySync接口与convertPemKey接口注意事项相同,见[convertPemKey](#convertpemkey12)接口说明。 2309 2310**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2311 2312**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2313 2314**参数:** 2315 2316| 参数名 | 类型 | 必填 | 说明 | 2317| ------ | -------- | ---- | ---------------- | 2318| pubKey | string \| null| 是 | 指定的公钥材料。如果公钥不需要转换,可直接传入null。| 2319| priKey | string \| null| 是 | 指定私钥材料。私钥无需转换时,可传入null。注意:公钥和私钥材料不能同时为null。| 2320 2321**返回值:** 2322 2323| 类型 | 说明 | 2324| ----------------- | --------------------------------- | 2325| [KeyPair](#keypair) | 非对称密钥。 | 2326 2327**错误码:** 2328以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 2329 2330| 错误码ID | 错误信息 | 2331| -------- | ---------------------- | 2332| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2333| 17620001 | memory operation failed. | 2334| 17630001 | crypto operation error. | 2335 2336**示例:** 2337 2338```ts 2339import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2340import { BusinessError } from '@kit.BasicServicesKit'; 2341 2342let priKeyPkcs1Str1024: string = 2343 "-----BEGIN RSA PRIVATE KEY-----\n" 2344 + "MIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\n" 2345 + "Y68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\n" 2346 + "YOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\n" 2347 + "AoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\n" 2348 + "LjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n" 2349 + "7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\n" 2350 + "D3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\n" 2351 + "e3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\n" 2352 + "a1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\n" 2353 + "MzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\n" 2354 + "DyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\n" 2355 + "qc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\n" 2356 + "akNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n" 2357 + "-----END RSA PRIVATE KEY-----\n"; 2358 let publicPkcs1Str1024: string = 2359 "-----BEGIN RSA PUBLIC KEY-----\n" 2360 + "MIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\n" 2361 + "h7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\n" 2362 + "SHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n" 2363 + "-----END RSA PUBLIC KEY-----\n"; 2364function TestConvertPemKeyBySync() { 2365 let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 2366 try { 2367 let keyPairData = asyKeyGenerator.convertPemKeySync(publicPkcs1Str1024, priKeyPkcs1Str1024); 2368 if (keyPairData != null) { 2369 console.info('[Sync]: convert pem key pair success'); 2370 } else { 2371 console.error("[Sync]: convert pem key pair result fail!"); 2372 } 2373 } catch (e) { 2374 console.error(`Sync error, ${e.code}, ${e.message}`); 2375 } 2376} 2377``` 2378 2379### convertPemKeySync<sup>18+</sup> 2380 2381convertPemKeySync(pubKey: string | null, priKey: string | null, password: string): KeyPair 2382 2383同步获取指定数据,生成非对称密钥。 2384 2385> **说明:** 2386> convertPemKeySync接口与convertPemKey接口注意事项相同,见[convertPemKey](#convertpemkey18)接口说明。 2387 2388**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 2389 2390**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2391 2392**参数:** 2393 2394| 参数名 | 类型 | 必填 | 说明 | 2395| ------ | -------- | ---- | ---------------- | 2396| pubKey | string \| null| 是 | 指定的公钥材料。如果公钥不需要转换,可传入null。| 2397| priKey | string \| null| 是 | 指定私钥材料。若无需转换,传入 null。注意:公钥与私钥材料不可同时为 null。| 2398| password | string | 是 | 指定口令,用于解密私钥。| 2399 2400**返回值:** 2401 2402| 类型 | 说明 | 2403| ----------------- | --------------------------------- | 2404| [KeyPair](#keypair) | 非对称密钥。 | 2405 2406**错误码:** 2407以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 2408 2409| 错误码ID | 错误信息 | 2410| -------- | ---------------------- | 2411| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2412| 17620001 | memory operation failed. | 2413| 17630001 | crypto operation error. | 2414 2415**示例:** 2416 2417```ts 2418import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2419import { BusinessError } from '@kit.BasicServicesKit'; 2420 2421let priKeyPkcs1EncodingStr : string = 2422 "-----BEGIN RSA PRIVATE KEY-----\n" 2423 +"Proc-Type: 4,ENCRYPTED\n" 2424 +"DEK-Info: AES-128-CBC,815A066131BF05CF87CE610A59CC69AE\n\n" 2425 +"7Jd0vmOmYGFZ2yRY8fqRl3+6rQlFtNcMILvcb5KWHDSrxA0ULmJE7CW0DSRikHoA\n" 2426 +"t0KgafhYXeQXh0dRy9lvVRAFSLHCLJVjchx90V7ZSivBFEq7+iTozVp4AlbgYsJP\n" 2427 +"vx/1sfZD2WAcyMJ7IDmJyft7xnpVSXsyWGTT4f3eaHJIh1dqjwrso7ucAW0FK6rp\n" 2428 +"/TONyOoXNfXtRbVtxNyCWBxt4HCSclDZFvS9y8fz9ZwmCUV7jei/YdzyQI2wnE13\n" 2429 +"W8cKlpzRFL6BWi8XPrUtAw5MWeHBAPUgPWMfcmiaeyi5BJFhQCrHLi+Gj4EEJvp7\n" 2430 +"mP5cbnQAx6+paV5z9m71SKrI/WSc4ixsYYdVmlL/qwAK9YliFfoPl030YJWW6rFf\n" 2431 +"T7J9BUlHGUJ0RB2lURNNLakM+UZRkeE9TByzCzgTxuQtyv5Lwsh2mAk3ia5x0kUO\n" 2432 +"LHg3Eoabhdh+YZA5hHaxnpF7VjspB78E0F9Btq+A41rSJ6zDOdToHey4MJ2nxdey\n" 2433 +"Z3bi81TZ6Fp4IuROrvZ2B/Xl3uNKR7n+AHRKnaAO87ywzyltvjwSh2y3xhJueiRs\n" 2434 +"BiYkyL3/fnocD3pexTdN6h3JgQGgO5GV8zw/NrxA85mw8o9im0HreuFObmNj36T9\n" 2435 +"k5N+R/QIXW83cIQOLaWK1ThYcluytf0tDRiMoKqULiaA6HvDMigExLxuhCtnoF8I\n" 2436 +"iOLN1cPdEVQjzwDHLqXP2DbWW1z9iRepLZlEm1hLRLEmOrTGKezYupVv306SSa6J\n" 2437 +"OA55lAeXMbyjFaYCr54HWrpt4NwNBX1efMUURc+1LcHpzFrBTTLbfjIyq6as49pH\n" 2438 +"-----END RSA PRIVATE KEY-----\n" 2439function TestConvertPemKeyBySync() { 2440 let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 2441 try { 2442 let keyPairData = asyKeyGenerator.convertPemKeySync(null, priKeyPkcs1EncodingStr, "123456"); 2443 if (keyPairData != null) { 2444 console.info('[Sync]: convert pem key pair success'); 2445 } else { 2446 console.error("[Sync]: convert pem key pair result fail!"); 2447 } 2448 } catch (e) { 2449 console.error(`Sync error, ${e.code}, ${e.message}`); 2450 } 2451} 2452``` 2453 2454## cryptoFramework.createAsyKeyGeneratorBySpec<sup>10+</sup> 2455 2456createAsyKeyGeneratorBySpec(asyKeySpec: AsyKeySpec): AsyKeyGeneratorBySpec 2457 2458指定密钥参数,获取非对称密钥生成器实例。 2459 2460支持的规格详见[非对称密钥生成和转换规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md)。 2461 2462**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2463 2464**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2465 2466API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 2467 2468**参数:** 2469 2470| 参数名 | 类型 | 必填 | 说明 | 2471| ------- | ------ | ---- | -------------------------------- | 2472| asyKeySpec | [AsyKeySpec](#asykeyspec10) | 是 | 密钥参数。非对称密钥生成器根据指定的这些参数生成公/私钥。 | 2473 2474**返回值:** 2475 2476| 类型 | 说明 | 2477| ----------------------------------------------- | -------------------------- | 2478| [AsyKeyGeneratorBySpec](#asykeygeneratorbyspec10) | 返回非对称密钥生成器实例。 | 2479 2480**错误码:** 2481以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2482 2483| 错误码ID | 错误信息 | 2484| -------- | ---------------------- | 2485| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 2486| 801 | this operation is not supported. | 2487| 17620001 | memory operation failed. | 2488 2489**示例:** 2490 2491```ts 2492import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2493 2494// 配置DSA1024公钥和私钥中包含的公共参数。 2495function genDsa1024CommonSpecBigE() { 2496 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2497 algName: "DSA", 2498 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2499 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2500 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2501 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2502 } 2503 return dsaCommonSpec; 2504} 2505 2506// 设置DSA1024密钥对中包含的全参数。 2507function genDsa1024KeyPairSpecBigE() { 2508 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2509 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2510 algName: "DSA", 2511 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2512 params: dsaCommonSpec, 2513 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2514 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2515 } 2516 return dsaKeyPairSpec; 2517} 2518 2519let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2520let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2521``` 2522 2523## AsyKeyGeneratorBySpec<sup>10+</sup> 2524 2525非对称密钥生成器。在使用该类的方法前,需要先使用[createAsyKeyGeneratorBySpec()](#cryptoframeworkcreateasykeygeneratorbyspec10)方法构建一个AsyKeyGeneratorBySpec实例。 2526 2527### 属性 2528 2529**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2530 2531**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2532 2533API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 2534 2535| 名称 | 类型 | 只读 | 可选 | 说明 | 2536| ------- | ------ | ---- | ---- | -------------------------- | 2537| algName | string | 是 | 否 | 非对称密钥生成器的算法名。 | 2538 2539### generateKeyPair<sup>10+</sup> 2540 2541generateKeyPair(callback: AsyncCallback\<KeyPair>): void 2542 2543异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2544 2545当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2546 2547**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2548 2549**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2550 2551API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 2552 2553**参数:** 2554 2555| 参数名 | 类型 | 必填 | 说明 | 2556| -------- | ----------------------- | ---- | ------------------------------ | 2557| callback | AsyncCallback\<[KeyPair](#keypair)> | 是 | 回调函数,用于获取非对称密钥。 | 2558 2559**错误码:** 2560以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2561 2562| 错误码ID | 错误信息 | 2563| -------- | ----------------------- | 2564| 401 | invalid parameters. Possible causes: <br>Incorrect parameter types; | 2565| 17620001 | memory operation failed. | 2566| 17630001 | crypto operation error. | 2567 2568**示例:** 2569 2570```ts 2571import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2572 2573// 配置DSA1024公钥和私钥中包含的公共参数。 2574function genDsa1024CommonSpecBigE() { 2575 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2576 algName: "DSA", 2577 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2578 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2579 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2580 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2581 } 2582 return dsaCommonSpec; 2583} 2584 2585// 设置DSA1024密钥对中包含的全参数。 2586function genDsa1024KeyPairSpecBigE() { 2587 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2588 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2589 algName: "DSA", 2590 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2591 params: dsaCommonSpec, 2592 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2593 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2594 } 2595 return dsaKeyPairSpec; 2596} 2597 2598function testGenerateKeyPair() 2599{ 2600 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2601 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2602 asyKeyGeneratorBySpec.generateKeyPair((err, keyPair) => { 2603 if (err) { 2604 console.error("generateKeyPair: error."); 2605 return; 2606 } 2607 console.info('generateKeyPair: success.'); 2608 }) 2609} 2610``` 2611 2612### generateKeyPair<sup>10+</sup> 2613 2614generateKeyPair(): Promise\<KeyPair> 2615 2616异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 2617 2618当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2619 2620**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2621 2622**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2623 2624API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 2625 2626**返回值:** 2627 2628| 类型 | 说明 | 2629| ----------------- | --------------------------------- | 2630| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 | 2631 2632**错误码:** 2633以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2634 2635| 错误码ID | 错误信息 | 2636| -------- | ---------------------- | 2637| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2638| 17620001 | memory operation failed. | 2639| 17630001 | crypto operation error. | 2640 2641**示例:** 2642 2643```ts 2644import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2645import { BusinessError } from '@kit.BasicServicesKit'; 2646// 配置DSA1024公钥和私钥中包含的公共参数。 2647function genDsa1024CommonSpecBigE() { 2648 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2649 algName: "DSA", 2650 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2651 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2652 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2653 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2654 } 2655 return dsaCommonSpec; 2656} 2657 2658// 设置DSA1024密钥对中包含的全参数。 2659function genDsa1024KeyPairSpecBigE() { 2660 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2661 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2662 algName: "DSA", 2663 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2664 params: dsaCommonSpec, 2665 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2666 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2667 } 2668 return dsaKeyPairSpec; 2669} 2670 2671function testGenerateKeyPair() 2672{ 2673 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2674 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2675 let keyGenPromise = asyKeyGeneratorBySpec.generateKeyPair(); 2676 keyGenPromise.then(keyPair => { 2677 console.info('generateKeyPair success.'); 2678 }).catch((error: BusinessError) => { 2679 console.error("generateKeyPair error."); 2680 }); 2681} 2682``` 2683 2684### generateKeyPairSync<sup>12+</sup> 2685 2686generateKeyPairSync(): KeyPair 2687 2688同步获取该非对称密钥生成器生成的密钥。 2689 2690当使用[COMMON_PARAMS_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到随机生成的密钥对;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到各项数据与密钥参数一致的密钥对。 2691 2692**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2693 2694**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2695 2696**返回值:** 2697 2698| 类型 | 说明 | 2699| ----------------- | --------------------------------- | 2700| [KeyPair](#keypair) | 非对称密钥。 | 2701 2702**错误码:** 2703以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2704 2705| 错误码ID | 错误信息 | 2706| -------- | ---------------------- | 2707| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2708| 17620001 | memory operation failed. | 2709| 17630001 | crypto operation error. | 2710 2711**示例:** 2712 2713```ts 2714import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2715import { BusinessError } from '@kit.BasicServicesKit'; 2716 2717// 配置DSA1024公钥和私钥中包含的公共参数。 2718function genDsa1024CommonSpecBigE() { 2719 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2720 algName: "DSA", 2721 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2722 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2723 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2724 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2725 } 2726 return dsaCommonSpec; 2727} 2728 2729// 设置DSA1024密钥对中包含的全参数。 2730function genDsa1024KeyPairSpecBigE() { 2731 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2732 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2733 algName: "DSA", 2734 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2735 params: dsaCommonSpec, 2736 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2737 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2738 } 2739 return dsaKeyPairSpec; 2740} 2741 2742function testGenerateKeyPairSync() 2743{ 2744 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2745 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2746 try { 2747 let keyPairData = asyKeyGeneratorBySpec.generateKeyPairSync(); 2748 if (keyPairData != null) { 2749 console.info('[Sync]: key pair success'); 2750 } else { 2751 console.error("[Sync]: get key pair result fail!"); 2752 } 2753 } catch (error) { 2754 let e: BusinessError = error as BusinessError; 2755 console.error(`sync error, ${e.code}, ${e.message}`); 2756 } 2757} 2758``` 2759 2760### generatePriKey<sup>10+</sup> 2761 2762generatePriKey(callback: AsyncCallback\<PriKey>): void 2763 2764异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2765 2766使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型密钥参数创建密钥生成器,生成指定私钥。使用[KEY_PAIR_SPEC](#asykeyspectype10)类型密钥参数创建密钥生成器,从生成的密钥对中获取指定私钥。 2767 2768**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2769 2770**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2771 2772API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 2773 2774**参数:** 2775 2776| 参数名 | 类型 | 必填 | 说明 | 2777| -------- | ----------------------- | ---- | ------------------------------ | 2778| callback | AsyncCallback\<[PriKey](#prikey)> | 是 | 回调函数,用于获取非对称密钥。 | 2779 2780**错误码:** 2781以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 2782 2783| 错误码ID | 错误信息 | 2784| -------- | ---------------------- | 2785| 401 | invalid parameters. Possible causes: <br>Mandatory parameters are left unspecified; | 2786| 17620001 | memory operation failed. | 2787| 17630001 | crypto operation error. | 2788 2789**示例:** 2790 2791```ts 2792import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2793import { BusinessError } from '@kit.BasicServicesKit'; 2794 2795// 配置DSA1024公钥和私钥中包含的公共参数。 2796function genDsa1024CommonSpecBigE() { 2797 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2798 algName: "DSA", 2799 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2800 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2801 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2802 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2803 } 2804 return dsaCommonSpec; 2805} 2806 2807// 设置DSA1024密钥对中包含的全参数。 2808function genDsa1024KeyPairSpecBigE() { 2809 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2810 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2811 algName: "DSA", 2812 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2813 params: dsaCommonSpec, 2814 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2815 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2816 } 2817 return dsaKeyPairSpec; 2818} 2819 2820function testGeneratePriKey() 2821{ 2822 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2823 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2824 asyKeyGeneratorBySpec.generatePriKey((err, prikey) => { 2825 if (err) { 2826 console.error("generatePriKey: error."); 2827 return; 2828 } 2829 console.info('generatePriKey: success.'); 2830 }) 2831} 2832``` 2833 2834### generatePriKey<sup>10+</sup> 2835 2836generatePriKey(): Promise\<PriKey> 2837 2838异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 2839 2840当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。 2841 2842**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2843 2844**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2845 2846API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 2847 2848**返回值:** 2849 2850| 类型 | 说明 | 2851| ----------------- | --------------------------------- | 2852| Promise\<[PriKey](#prikey)> | 使用Promise的方式获取非对称密钥。 | 2853 2854**错误码:** 2855以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 2856 2857| 错误码ID | 错误信息 | 2858| -------- | ---------------------- | 2859| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2860| 17620001 | memory operation failed. | 2861| 17630001 | crypto operation error. | 2862 2863**示例:** 2864 2865```ts 2866import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2867import { BusinessError } from '@kit.BasicServicesKit'; 2868 2869// 配置DSA1024公钥和私钥中包含的公共参数。 2870function genDsa1024CommonSpecBigE() { 2871 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2872 algName: "DSA", 2873 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2874 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2875 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2876 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2877 } 2878 return dsaCommonSpec; 2879} 2880 2881// 设置DSA1024密钥对中包含的全参数。 2882function genDsa1024KeyPairSpecBigE() { 2883 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2884 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2885 algName: "DSA", 2886 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2887 params: dsaCommonSpec, 2888 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2889 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2890 } 2891 return dsaKeyPairSpec; 2892} 2893 2894function testGeneratePriKey() 2895{ 2896 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2897 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2898 let keyGenPromise = asyKeyGeneratorBySpec.generatePriKey(); 2899 keyGenPromise.then(priKey => { 2900 console.info('generatePriKey success.'); 2901 }).catch((error: BusinessError) => { 2902 console.error("generatePriKey error."); 2903 }); 2904} 2905``` 2906 2907### generatePriKeySync<sup>12+</sup> 2908 2909generatePriKeySync(): PriKey 2910 2911同步获取该非对称密钥生成器生成的密钥。 2912 2913当使用[PRIVATE_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的私钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的私钥。 2914 2915**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2916 2917**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2918 2919**返回值:** 2920 2921| 类型 | 说明 | 2922| ----------------- | --------------------------------- | 2923| [PriKey](#prikey) | 非对称密钥。 | 2924 2925**错误码:** 2926以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 2927 2928| 错误码ID | 错误信息 | 2929| -------- | ---------------------- | 2930| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 2931| 17620001 | memory operation failed. | 2932| 17630001 | crypto operation error. | 2933 2934**示例:** 2935 2936```ts 2937import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 2938 2939// 配置DSA1024公钥和私钥中包含的公共参数。 2940function genDsa1024CommonSpecBigE() { 2941 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 2942 algName: "DSA", 2943 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 2944 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 2945 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 2946 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 2947 } 2948 return dsaCommonSpec; 2949} 2950 2951// 设置DSA1024密钥对中包含的全参数。 2952function genDsa1024KeyPairSpecBigE() { 2953 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 2954 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 2955 algName: "DSA", 2956 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 2957 params: dsaCommonSpec, 2958 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 2959 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 2960 } 2961 return dsaKeyPairSpec; 2962} 2963 2964function testGeneratePriKeySync() 2965{ 2966 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 2967 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 2968 try { 2969 let priKeyData = asyKeyGeneratorBySpec.generatePriKeySync(); 2970 if (priKeyData != null) { 2971 console.info('[Sync]: pri key success'); 2972 } else { 2973 console.error("[Sync]: get pri key result fail!"); 2974 } 2975 } catch (e) { 2976 console.error(`sync error, ${e.code}, ${e.message}`); 2977 } 2978} 2979``` 2980 2981### generatePubKey<sup>10+</sup> 2982 2983generatePubKey(callback: AsyncCallback\<PubKey>): void 2984 2985异步获取非对称密钥生成器生成的密钥,通过注册回调函数获取结果。 2986 2987当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。 2988 2989**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 2990 2991**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 2992 2993API version10-11系统能力为SystemCapability.Security.CryptoFramework;从API version12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 2994 2995**参数:** 2996 2997| 参数名 | 类型 | 必填 | 说明 | 2998| -------- | ----------------------- | ---- | ------------------------------ | 2999| callback | AsyncCallback\<[PubKey](#pubkey)> | 是 | 回调函数,用于获取非对称密钥。 | 3000 3001**错误码:** 3002以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 3003 3004| 错误码ID | 错误信息 | 3005| -------- | ---------------------- | 3006| 401 | invalid parameters. Possible causes:<br> Incorrect parameter types; | 3007| 17620001 | memory operation failed. | 3008| 17630001 | crypto operation error. | 3009 3010**示例:** 3011 3012```ts 3013import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3014 3015// 配置DSA1024公钥和私钥中包含的公共参数。 3016function genDsa1024CommonSpecBigE() { 3017 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 3018 algName: "DSA", 3019 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 3020 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 3021 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 3022 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 3023 } 3024 return dsaCommonSpec; 3025} 3026 3027// 设置DSA1024密钥对中包含的全参数。 3028function genDsa1024KeyPairSpecBigE() { 3029 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 3030 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 3031 algName: "DSA", 3032 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 3033 params: dsaCommonSpec, 3034 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 3035 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 3036 } 3037 return dsaKeyPairSpec; 3038} 3039 3040function testGeneratePubKey() 3041{ 3042 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 3043 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 3044 asyKeyGeneratorBySpec.generatePubKey((err, pubKey) => { 3045 if (err) { 3046 console.error("generatePubKey: error."); 3047 return; 3048 } 3049 console.info('generatePubKey: success.'); 3050 }) 3051} 3052``` 3053 3054### generatePubKey<sup>10+</sup> 3055 3056generatePubKey(): Promise\<PubKey> 3057 3058异步获取该非对称密钥生成器生成的密钥,通过Promise获取结果。 3059 3060当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;当使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以从生成的密钥对中获取指定的公钥。 3061 3062**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3063 3064**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 3065 3066API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 3067 3068**返回值:** 3069 3070| 类型 | 说明 | 3071| ----------------- | --------------------------------- | 3072| Promise\<[PubKey](#pubkey)> | 使用Promise的方式获取非对称密钥。 | 3073 3074**错误码:** 3075以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3076 3077| 错误码ID | 错误信息 | 3078| -------- | ---------------------- | 3079| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 3080| 17620001 | memory operation failed. | 3081| 17630001 | crypto operation error. | 3082 3083**示例:** 3084 3085```ts 3086import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3087import { BusinessError } from '@kit.BasicServicesKit'; 3088 3089// 配置DSA1024公钥和私钥中包含的公共参数。 3090function genDsa1024CommonSpecBigE() { 3091 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 3092 algName: "DSA", 3093 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 3094 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 3095 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 3096 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 3097 } 3098 return dsaCommonSpec; 3099} 3100 3101// 设置DSA1024密钥对中包含的全参数。 3102function genDsa1024KeyPairSpecBigE() { 3103 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 3104 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 3105 algName: "DSA", 3106 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 3107 params: dsaCommonSpec, 3108 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 3109 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 3110 } 3111 return dsaKeyPairSpec; 3112} 3113 3114function testGeneratePubKey() 3115{ 3116 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 3117 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 3118 let keyGenPromise = asyKeyGeneratorBySpec.generatePubKey(); 3119 keyGenPromise.then(pubKey => { 3120 console.info('generatePubKey success.'); 3121 }).catch((error: BusinessError) => { 3122 console.error("generatePubKey error."); 3123 }); 3124} 3125``` 3126 3127### generatePubKeySync<sup>12+</sup> 3128 3129generatePubKeySync(): PubKey 3130 3131同步获取该非对称密钥生成器生成的密钥。 3132 3133当使用[PUBLIC_KEY_SPEC](#asykeyspectype10)类型的密钥参数来创建密钥生成器时,可以得到指定的公钥;使用[KEY_PAIR_SPEC](#asykeyspectype10)类型的密钥参数时,可以从生成的密钥对中获取指定的公钥。 3134 3135**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3136 3137**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 3138 3139**返回值:** 3140 3141| 类型 | 说明 | 3142| ----------------- | --------------------------------- | 3143| [PubKey](#pubkey) | 非对称密钥。 | 3144 3145**错误码:** 3146以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3147 3148| 错误码ID | 错误信息 | 3149| -------- | ---------------------- | 3150| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 3151| 17620001 | memory operation failed. | 3152| 17630001 | crypto operation error. | 3153 3154**示例:** 3155 3156```ts 3157import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3158 3159// 配置DSA1024公钥和私钥中包含的公共参数。 3160function genDsa1024CommonSpecBigE() { 3161 let dsaCommonSpec: cryptoFramework.DSACommonParamsSpec = { 3162 algName: "DSA", 3163 specType: cryptoFramework.AsyKeySpecType.COMMON_PARAMS_SPEC, 3164 p: BigInt("0xed1501551b8ab3547f6355ffdc2913856ddeca198833dbd04f020e5f25e47c50e0b3894f7690a0d2ea5ed3a7be25c54292a698e1f086eb3a97deb4dbf04fcad2dafd94a9f35c3ae338ab35477e16981ded6a5b13d5ff20bf55f1b262303ad3a80af71aa6aa2354d20e9c82647664bdb6b333b7bea0a5f49d55ca40bc312a1729"), 3165 q: BigInt("0xd23304044019d5d382cfeabf351636c7ab219694ac845051f60b047b"), 3166 g: BigInt("0x2cc266d8bd33c3009bd67f285a257ba74f0c3a7e12b722864632a0ac3f2c17c91c2f3f67eb2d57071ef47aaa8f8e17a21ad2c1072ee1ce281362aad01dcbcd3876455cd17e1dd55d4ed36fa011db40f0bbb8cba01d066f392b5eaa9404bfcb775f2196a6bc20eeec3db32d54e94d87ecdb7a0310a5a017c5cdb8ac78597778bd"), 3167 } 3168 return dsaCommonSpec; 3169} 3170 3171// 设置DSA1024密钥对中包含的全参数。 3172function genDsa1024KeyPairSpecBigE() { 3173 let dsaCommonSpec = genDsa1024CommonSpecBigE(); 3174 let dsaKeyPairSpec: cryptoFramework.DSAKeyPairSpec = { 3175 algName: "DSA", 3176 specType: cryptoFramework.AsyKeySpecType.KEY_PAIR_SPEC, 3177 params: dsaCommonSpec, 3178 sk: BigInt("0xa2dd2adb2d11392c2541930f61f1165c370aabd2d78d00342e0a2fd9"), 3179 pk: BigInt("0xae6b5d5042e758f3fc9a02d009d896df115811a75b5f7b382d8526270dbb3c029403fafb8573ba4ef0314ea86f09d01e82a14d1ebb67b0c331f41049bd6b1842658b0592e706a5e4d20c14b67977e17df7bdd464cce14b5f13bae6607760fcdf394e0b73ac70aaf141fa4dafd736bd0364b1d6e6c0d7683a5de6b9221e7f2d6b"), 3180 } 3181 return dsaKeyPairSpec; 3182} 3183 3184function testGeneratePubKeySync() 3185{ 3186 let asyKeyPairSpec = genDsa1024KeyPairSpecBigE(); // The JS input must be a positive number in big-endian format. 3187 let asyKeyGeneratorBySpec = cryptoFramework.createAsyKeyGeneratorBySpec(asyKeyPairSpec); 3188 try { 3189 let pubKeyData = asyKeyGeneratorBySpec.generatePubKeySync(); 3190 if (pubKeyData != null) { 3191 console.info('[Sync]: pub key success'); 3192 } else { 3193 console.error("[Sync]: get pub key result fail!"); 3194 } 3195 } catch (e) { 3196 console.error(`sync error, ${e.code}, ${e.message}`); 3197 } 3198} 3199``` 3200 3201## ECCKeyUtil<sup>11+</sup> 3202 3203根据椭圆曲线名生成相应的非对称公共密钥参数。 3204 3205### genECCCommonParamsSpec<sup>11+</sup> 3206 3207static genECCCommonParamsSpec(curveName: string): ECCCommonParamsSpec 3208 3209根据椭圆曲线相应的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)。 3210 3211**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3212 3213**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 3214 3215API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 3216 3217**参数:** 3218 3219| 参数名 | 类型 | 必填 | 说明 | 3220| ------- | ------ | ---- | ---------------------------------------------- | 3221| curveName | string | 是 | 椭圆曲线相应的NID(Name IDentifier)字符串名称。 | 3222 3223**返回值:** 3224 3225| 类型 | 说明 | 3226| ----------------- | --------------------------------- | 3227| [ECCCommonParamsSpec](#ecccommonparamsspec10) | 返回ECC公共密钥参数。 | 3228 3229**错误码:** 3230以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3231 3232| 错误码ID | 错误信息 | 3233| -------- | -------------------------------- | 3234| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3235| 801 | this operation is not supported. | 3236| 17620001 | memory operation failed. | 3237 3238**示例:** 3239 3240```ts 3241import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3242import { BusinessError } from '@kit.BasicServicesKit'; 3243try { 3244 let ECCCommonParamsSpec = cryptoFramework.ECCKeyUtil.genECCCommonParamsSpec('NID_brainpoolP160r1'); 3245 console.info('genECCCommonParamsSpec success'); 3246} catch (err) { 3247 let e: BusinessError = err as BusinessError; 3248 console.error(`genECCCommonParamsSpec error, ${e.code}, ${e.message}`); 3249} 3250``` 3251 3252### convertPoint<sup>12+</sup> 3253 3254static convertPoint(curveName: string, encodedPoint: Uint8Array): Point 3255 3256根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),将指定的点数据转换为Point对象。当前支持压缩/非压缩格式的点数据。 3257 3258> **说明:** 3259> 3260> 根据RFC5480规范中第2.2节的描述:<br/> 3261> 1. 非压缩的点数据,表示为:前缀0x04\|x坐标\|y坐标; 3262> 2. 压缩的点数据,对于Fp素数域上的点(当前暂不支持F2m域),表示为:前缀0x03\|x坐标 (坐标y是奇数时),前缀0x02\|x坐标 (坐标y是偶数时)。 3263 3264**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3265 3266**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 3267 3268**参数:** 3269 3270| 参数名 | 类型 | 必填 | 说明 | 3271| ------------ | ---------- | ---- | ---------------------------------------------- | 3272| curveName | string | 是 | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 | 3273| encodedPoint | Uint8Array | 是 | 指定的ECC椭圆曲线上的点的数据。 | 3274 3275**返回值:** 3276 3277| 类型 | 说明 | 3278| ----------------- | ------------------- | 3279| [Point](#point10) | 返回ECC的Point对象。 | 3280 3281**错误码:** 3282以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3283 3284| 错误码ID | 错误信息 | 3285| -------- | ---------------------- | 3286| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3287| 17620001 | memory operation failed. | 3288| 17630001 | crypto operation error. | 3289 3290**示例:** 3291 3292```ts 3293import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3294 3295// 随机生成的非压缩点数据。 3296let 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]); 3297let returnPoint = cryptoFramework.ECCKeyUtil.convertPoint('NID_brainpoolP256r1', pkData); 3298console.info('returnPoint: ' + returnPoint.x.toString(16)); 3299``` 3300 3301### getEncodedPoint<sup>12+</sup> 3302 3303static getEncodedPoint(curveName: string, point: Point, format: string): Uint8Array 3304 3305根据椭圆曲线的曲线名,即相应的NID(Name IDentifier),按照指定的点数据格式,将Point对象转换为点数据。当前支持压缩/非压缩格式的点数据。 3306 3307**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3308 3309**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 3310 3311**参数:** 3312 3313| 参数名 | 类型 | 必填 | 说明 | 3314| ------------ | ----------------- | ---- | ---------------------------------------------- | 3315| curveName | string | 是 | 椭圆曲线的曲线名,即相应的NID(Name IDentifier)。 | 3316| point | [Point](#point10) | 是 | 椭圆曲线上的Point点对象。 | 3317| format | string | 是 | 需要获取的点数据格式,当前支持"COMPRESSED"或"UNCOMPRESSED"。 | 3318 3319**返回值:** 3320 3321| 类型 | 说明 | 3322| ----------------- | --------------------------------- | 3323| Uint8Array | 返回指定格式的点数据。 | 3324 3325**错误码:** 3326以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3327 3328| 错误码ID | 错误信息 | 3329| -------- | ---------------------- | 3330| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3331| 17620001 | memory operation failed. | 3332| 17630001 | crypto operation error. | 3333 3334**示例:** 3335 3336```ts 3337import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3338 3339async function doTest() { 3340 let generator = cryptoFramework.createAsyKeyGenerator('ECC_BrainPoolP256r1'); 3341 let keyPair = await generator.generateKeyPair(); 3342 let eccPkX = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_X_BN); 3343 let eccPkY = keyPair.pubKey.getAsyKeySpec(cryptoFramework.AsyKeySpecItem.ECC_PK_Y_BN); 3344 console.info('ECC_PK_X_BN 16:' + eccPkX.toString(16)); 3345 console.info('ECC_PK_Y_BN 16:' + eccPkY.toString(16)); 3346 // 将eccPkX.toString(16)结果放入x,eccPkY.toString(16)结果放入y。 3347 let returnPoint: cryptoFramework.Point = { 3348 x: BigInt('0x' + eccPkX.toString(16)), 3349 y: BigInt('0x' + eccPkY.toString(16)) 3350 }; 3351 let returnData = cryptoFramework.ECCKeyUtil.getEncodedPoint('NID_brainpoolP256r1', returnPoint, 'UNCOMPRESSED'); 3352 console.info('returnData: ' + returnData); 3353} 3354``` 3355 3356## DHKeyUtil<sup>11+</sup> 3357 3358根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。 3359 3360### genDHCommonParamsSpec<sup>11+</sup> 3361 3362static genDHCommonParamsSpec(pLen: number, skLen?: number): DHCommonParamsSpec 3363 3364根据素数P的长度和私钥长度(bit位数)生成DH公共密钥参数。详见[DH密钥生成规格](../../security/CryptoArchitectureKit/crypto-asym-key-generation-conversion-spec.md#dh)。 3365 3366**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3367 3368**系统能力:** SystemCapability.Security.CryptoFramework.Key.AsymKey 3369 3370API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Key.AsymKey。 3371 3372**参数:** 3373 3374| 参数名 | 类型 | 必填 | 说明 | 3375| ------ | ------ | ---- | ------------------------------------------------ | 3376| pLen | number | 是 | 用于指定DH公共密钥参数中素数P的长度,单位为bit。 | 3377| skLen | number | 否 | 用于指定DH公共密钥参数中私钥的长度,单位为bit。 | 3378 3379**返回值:** 3380 3381| 类型 | 说明 | 3382| ----------------- | --------------------------------- | 3383| [DHCommonParamsSpec](#dhcommonparamsspec11) | 返回DH公共密钥参数。 | 3384 3385**错误码:** 3386以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3387 3388| 错误码ID | 错误信息 | 3389| -------- | -------------------------------- | 3390| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3391| 801 | this operation is not supported. | 3392| 17620001 | memory operation failed. | 3393| 17630001 | crypto operation error. | 3394 3395**示例:** 3396 3397```ts 3398import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3399import { BusinessError } from '@kit.BasicServicesKit'; 3400try { 3401 let DHCommonParamsSpec = cryptoFramework.DHKeyUtil.genDHCommonParamsSpec(2048); 3402 console.info('genDHCommonParamsSpec success'); 3403} catch (err) { 3404 let e: BusinessError = err as BusinessError; 3405 console.error(`genDHCommonParamsSpec error, ${e.code}, ${e.message}`); 3406} 3407``` 3408 3409## SM2CryptoUtil<sup>12+</sup> 3410 3411用于SM2密码学运算的工具类。 3412 3413### genCipherTextBySpec<sup>12+</sup> 3414 3415static genCipherTextBySpec(spec: SM2CipherTextSpec, mode?: string): DataBlob 3416 3417根据指定的SM2密文参数,生成符合国密标准的ASN.1格式SM2密文。 3418 3419**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3420 3421**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3422 3423**参数:** 3424 3425| 参数名 | 类型 | 必填 | 说明 | 3426| ------ | ------ | ---- | ------------------------------------------------ | 3427| spec | [SM2CipherTextSpec](#sm2ciphertextspec12) | 是 | 指定的SM2密文参数。 | 3428| mode | string | 否 | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。 | 3429 3430**返回值:** 3431 3432| 类型 | 说明 | 3433| ----------------- | --------------------------------- | 3434| [DataBlob](#datablob) | 返回符合国密标准的ASN.1格式的SM2密文。 | 3435 3436**错误码:** 3437以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3438 3439| 错误码ID | 错误信息 | 3440| -------- | -------------------------------- | 3441| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3442| 17620001 | memory operation failed. | 3443| 17630001 | crypto operation error. | 3444 3445**示例:** 3446 3447```ts 3448import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3449import { BusinessError } from '@kit.BasicServicesKit'; 3450try { 3451 let spec : cryptoFramework.SM2CipherTextSpec = { 3452 xCoordinate: BigInt('20625015362595980457695435345498579729138244358573902431560627260141789922999'), 3453 yCoordinate: BigInt('48563164792857017065725892921053777369510340820930241057309844352421738767712'), 3454 cipherTextData: new Uint8Array([100,227,78,195,249,179,43,70,242,69,169,10,65,123]), 3455 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]), 3456 } 3457 let data = cryptoFramework.SM2CryptoUtil.genCipherTextBySpec(spec, 'C1C3C2'); 3458 console.info('genCipherTextBySpec success'); 3459} catch (err) { 3460 let e: BusinessError = err as BusinessError; 3461 console.error(`genCipherTextBySpec error, ${e.code}, ${e.message}`); 3462} 3463``` 3464 3465### getCipherTextSpec<sup>12+</sup> 3466 3467static getCipherTextSpec(cipherText: DataBlob, mode?: string): SM2CipherTextSpec 3468 3469从符合国密标准的ASN.1格式的SM2密文中,获取具体的SM2密文参数。 3470 3471**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3472 3473**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3474 3475**参数:** 3476 3477| 参数名 | 类型 | 必填 | 说明 | 3478| ------ | ------ | ---- | ------------------------------------------------ | 3479| cipherText | [DataBlob](#datablob) | 是 | 符合国密标准的ASN.1格式的SM2密文。 3480| mode | string | 否 | 可选的密文转换模式,可用于指定密文参数的拼接顺序,当前仅支持默认值"C1C3C2"。 | 3481 3482**返回值:** 3483 3484| 类型 | 说明 | 3485| ----------------- | --------------------------------- | 3486| [SM2CipherTextSpec](#sm2ciphertextspec12) | 返回SM2密文参数。 | 3487 3488**错误码:** 3489以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3490 3491| 错误码ID | 错误信息 | 3492| -------- | -------------------------------- | 3493| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3494| 17620001 | memory operation failed. | 3495| 17630001 | crypto operation error. | 3496 3497```ts 3498import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3499import { BusinessError } from '@kit.BasicServicesKit'; 3500try { 3501 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]); 3502 let cipherText : cryptoFramework.DataBlob = {data : cipherTextArray}; 3503 let spec : cryptoFramework.SM2CipherTextSpec = cryptoFramework.SM2CryptoUtil.getCipherTextSpec(cipherText, 'C1C3C2'); 3504 console.info('getCipherTextSpec success'); 3505} catch (err) { 3506 let e: BusinessError = err as BusinessError; 3507 console.error(`getCipherTextSpec error, ${e.code}, ${e.message}`); 3508} 3509``` 3510 3511## cryptoFramework.createCipher 3512 3513createCipher(transformation: string): Cipher 3514 3515通过指定算法名称,获取相应的[Cipher](#cipher)实例。 3516 3517支持的规格详见[对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-sym-encrypt-decrypt-spec.md)和[非对称密钥加解密算法规格](../../security/CryptoArchitectureKit/crypto-asym-encrypt-decrypt-spec.md)。 3518 3519**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3520 3521**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3522 3523API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 3524 3525**参数:** 3526 3527| 参数名 | 类型 | 必填 | 说明 | 3528| -------------- | ------ | ---- | ------------------------------------------------------------ | 3529| transformation | string | 是 | 待生成Cipher的算法名称(含密钥长度)、加密模式以及填充方法的组合。 | 3530 3531> **说明:** 3532> 3533> 1. 目前对称加解密中,PKCS5和PKCS7的实现相同,其padding长度和分组长度保持一致。在3DES中均按8字节填充,在AES中均按16字节填充。另有NoPadding表示不填充。 3534> <br/>开发者需要自行了解密码学不同分组模式的差异,以便选择合适的参数规格。例如选择ECB和CBC模式时,建议启用填充,否则必须确保明文长度是分组大小的整数倍;选择其他模式时,可以不启用填充,此时密文长度和明文长度一致(即可能不是分组大小的整数倍)。 3535> 2. 使用RSA或SM2进行非对称加解密时,必须创建两个Cipher对象,分别进行加密和解密操作,不能对同一个Cipher对象进行加解密。对称加解密没有此要求,只要算法规格一致,可以对同一个Cipher对象进行加解密操作。 3536 3537**返回值:** 3538 3539| 类型 | 说明 | 3540| ----------------- | ------------------------ | 3541| [Cipher](#cipher) | 返回加解密生成器的对象。 | 3542 3543**错误码:** 3544以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 3545 3546| 错误码ID | 错误信息 | 3547| -------- | ---------------------- | 3548| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3549| 801 | this operation is not supported. | 3550| 17620001 | memory operation failed. | 3551 3552**示例:** 3553 3554```ts 3555import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3556import { BusinessError } from '@kit.BasicServicesKit'; 3557 3558let cipherAlgName = '3DES192|ECB|PKCS7'; 3559try { 3560 let cipher = cryptoFramework.createCipher(cipherAlgName); 3561 console.info('cipher algName:' + cipher.algName); 3562} catch (error) { 3563 let e: BusinessError = error as BusinessError; 3564 console.error(`sync error, ${e.code}, ${e.message}`); 3565} 3566``` 3567 3568## Cipher 3569 3570提供加解密的算法操作功能,按序调用本类中的[init()](#init-1)、[update()](#update)、[doFinal()](#dofinal)方法,可以实现对称加密/对称解密/非对称加密/非对称解密。 3571 3572完整的加解密流程示例可参考[开发指南](../../security/CryptoArchitectureKit/crypto-encryption-decryption-overview.md)。 3573 3574一次完整的加/解密流程在对称加密和非对称加密中略有不同: 3575 3576- 对称加解密:init为必选,update为可选(且允许多次update加/解密大数据),doFinal为必选;doFinal结束后可以重新init开始新一轮加/解密流程。 3577- RSA、SM2非对称加解密:init为必选,不支持update操作,doFinal为必选(允许连续多次doFinal加/解密大数据);RSA不支持重复init,切换加解密模式或填充方式时,需要重新创建Cipher对象。 3578 3579### 属性 3580 3581**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3582 3583**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3584 3585API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 3586 3587| 名称 | 类型 | 只读 | 可选 | 说明 | 3588| ------- | ------ | ---- | ---- | ---------------------------- | 3589| algName | string | 是 | 否 | 加解密生成器指定的算法名称。 | 3590 3591### init 3592 3593init(opMode: CryptoMode, key: Key, params: ParamsSpec | null, callback: AsyncCallback\<void>): void 3594 3595初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 3596 3597必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 3598 3599**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3600 3601**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3602 3603API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 3604 3605**参数:** 3606 3607| 参数名 | 类型 | 必填 | 说明 | 3608| -------- | ------------------------- | ---- | ------------------------------------------------------------ | 3609| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 3610| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 3611| params | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前只支持ParamsSpec, API 10之后增加支持null。 | 3612| callback | AsyncCallback\<void> | 是 | 回调函数。当加解密初始化成功,err为undefined,否则为错误对象。 | 3613 3614**错误码:** 3615以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 3616 3617| 错误码ID | 错误信息 | 3618| -------- | --------------------------------------------------------- | 3619| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3620| 17620001 | memory operation failed. | 3621| 17620002 | failed to convert parameters between arkts and c. | 3622| 17630001 | crypto operation error.| 3623 3624### init 3625 3626init(opMode: CryptoMode, key: Key, params: ParamsSpec | null): Promise\<void> 3627 3628初始化加解密的cipher对象,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 3629 3630必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 3631 3632**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3633 3634**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3635 3636API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 3637 3638**参数:** 3639 3640| 参数名 | 类型 | 必填 | 说明 | 3641| ------ | ------------------------- | ---- | ------------------------------------------------------------ | 3642| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 3643| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 3644| params | [ParamsSpec](#paramsspec) \| null<sup>10+</sup> | 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。API 10之前仅支持ParamsSpec,从API 10开始增加对null的支持。 | 3645 3646**返回值:** 3647 3648| 类型 | 说明 | 3649| -------------- | -------------------------------------- | 3650| Promise\<void> | 无返回结果的Promise对象。 | 3651 3652**错误码:** 3653以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3654 3655| 错误码ID | 错误信息 | 3656| -------- | ------------------------------------------------- | 3657| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3658| 17620001 | memory operation failed. | 3659| 17620002 | failed to convert parameters between arkts and c. | 3660| 17630001 | crypto operation error.| 3661 3662### initSync<sup>12+</sup> 3663 3664initSync(opMode: CryptoMode, key: Key, params: ParamsSpec | null): void 3665 3666初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。 3667 3668必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。 3669 3670**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3671 3672**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3673 3674**参数:** 3675 3676| 参数名 | 类型 | 必填 | 说明 | 3677| ------ | ----------------------------------------------- | ---- | ------------------------------------------------------------ | 3678| opMode | [CryptoMode](#cryptomode) | 是 | 加密或者解密模式。 | 3679| key | [Key](#key) | 是 | 指定加密或解密的密钥。 | 3680| params | [ParamsSpec](#paramsspec) \| null| 是 | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 | 3681 3682**错误码:** 3683以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3684 3685| 错误码ID | 错误信息 | 3686| -------- | ----------------------- | 3687| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3688| 17620001 | memory operation failed. | 3689| 17620002 | failed to convert parameters between arkts and c. | 3690| 17630001 | crypto operation error. | 3691 3692### update 3693 3694update(data: DataBlob, callback: AsyncCallback\<DataBlob>): void 3695 3696分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。 3697 3698必须在对[Cipher](#cipher)实例使用[init()](#init-1)初始化后,才能使用本函数。 3699 3700> **说明:** 3701> 3702> 1. 在进行对称加解密操作时,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果进行判断,确保其不为null,并在结果不为null时取出数据进行拼接,形成完整的密文或明文。这是因选择的分组模式等各项规格可能对update和doFinal的结果产生影响。 3703> 3704> 例如,对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组为单位进行加解密,并输出本次update新产生的加解密分组结果。 3705> 3706> 可以理解为update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,将当前未被加解密的数据留着,等下一次update或doFinal传入数据时,拼接起来继续凑分组。 3707> 3708> 最后doFinal时,会将剩下的未加解密的数据根据[createCipher](#cryptoframeworkcreatecipher)时设置的填充模式进行填充,补齐到分组的整数倍长度,再输出剩余的加解密结果。 3709> 3710> 对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度与明文长度相同的情况。 3711> 3712> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。 3713> 3714> 算法库未对单次或累计的update数据量设置限制。对于大数据量的对称加解密操作,建议分多次调用update方法传入数据。 3715> 3716> AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。 3717> 3. RSA、SM2非对称加解密不支持update操作。 3718> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。 3719 3720**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3721 3722**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3723 3724API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 3725 3726**参数:** 3727 3728| 参数名 | 类型 | 必填 | 说明 | 3729| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ | 3730| data | [DataBlob](#datablob) | 是 | 需要进行加密或解密的数据。data不能为null。 | 3731| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数。更新加/解密数据成功时,err为undefined,data为DataBlob;否则为错误对象。 | 3732 3733**错误码:** 3734以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3735 3736| 错误码ID | 错误信息 | 3737| -------- | ------------------------------------------- | 3738| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3739| 17620001 | memory operation failed. | 3740| 17620002 | failed to convert parameters between arkts and c. | 3741| 17630001 | crypto operation error. | 3742 3743### update 3744 3745update(data: DataBlob): Promise\<DataBlob> 3746 3747分段更新加密或者解密数据操作,通过Promise获取加/解密数据。 3748 3749必须在对[Cipher](#cipher)实例使用[init()](#init-1)初始化后,才能使用本函数。 3750 3751> **说明:** 3752> 3753> 1. 在进行对称加解密操作时,如果开发者对各分组模式不够熟悉,建议每次调用update和doFinal后,都判断结果是否为null。如果结果不为null,则取出其中的数据进行拼接,以形成完整的密文或明文。这是因为选择的分组模式等各项规格可能会影响update和doFinal的结果。 3754> <br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。) 3755> 2. 根据数据量,可以不调用update(即init完成后直接调用doFinal)或多次调用update。<br/> 3756> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,可以采用多次update的方式传入数据。<br/> 3757> AES使用多次update操作的示例代码详见[使用AES对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm-by-segment.md)。 3758> 3. RSA、SM2非对称加解密不支持update操作。 3759> 4. 对于CCM模式的对称加解密算法,加密时只能调用1次update接口加密数据并调用doFinal接口获取tag,或直接调用doFinal接口加密数据并获取tag,解密时只能调用1次update接口或调用1次doFinal接口解密数据并验证tag。 3760 3761**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3762 3763**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3764 3765API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 3766 3767**参数:** 3768 3769| 参数名 | 类型 | 必填 | 说明 | 3770| ---- | --------------------- | ---- | -------------------- | 3771| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。data不能为null。 | 3772 3773**返回值:** 3774 3775| 类型 | 说明 | 3776| ------------------------------- | ------------------------------------------------ | 3777| Promise\<[DataBlob](#datablob)> | Promise对象,返回此次更新的加/解密结果DataBlob。 | 3778 3779**错误码:** 3780以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3781 3782| 错误码ID | 错误信息 | 3783| -------- | -------------------------------------------- | 3784| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3785| 17620001 | memory operation failed. | 3786| 17620002 | failed to convert parameters between arkts and c. | 3787| 17630001 | crypto operation error. | 3788 3789### updateSync<sup>12+</sup> 3790 3791updateSync(data: DataBlob): DataBlob 3792 3793分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。 3794 3795必须在对[Cipher](#cipher)实例使用[initSync()](#initsync12)初始化后,才能使用本函数。 3796 3797其他注意事项同上异步接口说明。 3798 3799**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3800 3801**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3802 3803**参数:** 3804 3805| 参数名 | 类型 | 必填 | 说明 | 3806| ------ | --------------------- | ---- | ------------------------------------------------------------ | 3807| data | [DataBlob](#datablob) | 是 | 加密或者解密的数据。data不能为null。 | 3808 3809**返回值:** 3810 3811| 类型 | 说明 | 3812| ------------------------------- | ------------------------------------------------ | 3813| [DataBlob](#datablob) | 返回此次更新的加/解密结果DataBlob。 | 3814 3815**错误码:** 3816以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3817 3818| 错误码ID | 错误信息 | 3819| -------- | ----------------------- | 3820| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3821| 17620001 | memory operation failed. | 3822| 17620002 | failed to convert parameters between arkts and c. | 3823| 17630001 | crypto operation error. | 3824 3825### doFinal 3826 3827doFinal(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void 3828 3829(1)在对称加解密中doFinal用于处理剩余数据和本次传入的数据,并最终结束加密或解密操作,通过注册回调函数获取加密或解密后的数据。如果数据量较小,可以在 `doFinal` 中一次性传入数据,而不使用update;如果在本次加解密流程中已经使用[update](#update)传入过数据,可以在doFinal的data参数处传入null。根据对称加解密的模式不同,doFinal的输出有以下区别: 3830 3831- 在GCM和CCM模式的对称加密中,一次加密流程中,将每次update和doFinal的结果拼接起来,会得到“密文 + authTag”。GCM模式下,authTag为末尾的16字节;CCM模式下,authTag为末尾的12字节。其余部分均为密文。如果doFinal的data参数传入null,则doFinal的结果就是authTag。解密时,authTag需要填入[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec),密文作为解密时的data参数。 3832- 对于其他模式的对称加解密及GCM和CCM模式的对称解密:每次加/解密流程中,update和doFinal的结果拼接起来,得到完整的明文或密文。 3833 3834 3835(2)在RSA、SM2非对称加解密中,doFinal加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。 3836 3837> **说明:** 3838> 3839> 1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用init()并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。 3840> 2. 如果遇到解密失败,需检查加解密数据和init时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。 3841> 3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。<br/> 3842> 对于加密,CFB、OFB和CTR模式,如果doFinal传null, 则返回结果为null。<br/> 3843> 对于解密,GCM、CCM、CFB、OFB和CTR模式,如果doFinal传null,则返回结果为null;对于解密,其他模式,如果明文是加密块大小的整倍数,调用update传入所有密文,调用doFinal传null, 则返回结果为null。<br/> 3844> 4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。 3845 3846**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3847 3848**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3849 3850API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 3851 3852**参数:** 3853 3854| 参数名 | 类型 | 必填 | 说明 | 3855| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ | 3856| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 加密或解密的数据。在对称加解密中可为null,但不可传入{data: Uint8Array(空) }。API 10前仅支持DataBlob,API 10后增加null支持。 | 3857| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数。最终加/解密成功时,err为undefined,data为加/解密结果DataBlob;否则为错误对象。 | 3858 3859**错误码:** 3860以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 3861 3862| 错误码ID | 错误信息 | 3863| -------- | ----------------------- | 3864| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3865| 17620001 | memory operation failed. | 3866| 17620002 | failed to convert parameters between arkts and c. | 3867| 17630001 | crypto operation error. | 3868 3869**以AES GCM模式加密为例:** 3870 3871更多加解密流程的完整示例请参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 3872 3873```ts 3874import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3875import { buffer } from '@kit.ArkTS'; 3876 3877function generateRandom(len: number) { 3878 let rand = cryptoFramework.createRandom(); 3879 let generateRandSync = rand.generateRandomSync(len); 3880 return generateRandSync; 3881} 3882 3883function genGcmParamsSpec() { 3884 let ivBlob = generateRandom(12); 3885 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 3886 let dataAad = new Uint8Array(arr); 3887 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 3888 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 3889 let dataTag = new Uint8Array(arr); 3890 let tagBlob: cryptoFramework.DataBlob = { 3891 data: dataTag 3892 }; 3893 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 3894 iv: ivBlob, 3895 aad: aadBlob, 3896 authTag: tagBlob, 3897 algName: "GcmParamsSpec" 3898 }; 3899 return gcmParamsSpec; 3900} 3901 3902function cipherByCallback() { 3903 let gcmParams = genGcmParamsSpec(); 3904 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 3905 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 3906 symKeyGenerator.generateSymKey((err, symKey) => { 3907 cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams, (err) => { 3908 let message = "This is a test"; 3909 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 3910 cipher.update(plainText, (err, encryptUpdate) => { 3911 cipher.doFinal(null, (err, tag) => { 3912 gcmParams.authTag = tag; 3913 console.info('encryptUpdate plainText:' + encryptUpdate.data); 3914 }); 3915 }); 3916 }); 3917 }); 3918} 3919``` 3920 3921### doFinal 3922 3923doFinal(data: DataBlob | null): Promise\<DataBlob> 3924 3925(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过Promise获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用update传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别: 3926 3927- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。 3928- 对于其他模式的对称加解密及GCM和CCM模式的对称解密:一次加解密流程中,每次update和doFinal的结果拼接起来,得到完整的明文或密文。 3929 3930(2)在RSA和SM2非对称加解密中,使用doFinal方法加解密传入的数据,并通过Promise获取加密或解密结果。如果数据量较大,可以多次调用doFinal,拼接结果以获得完整的明文或密文。 3931 3932> **说明:** 3933> 3934> 1. 对称加解密中,调用doFinal标志着一次加解密流程完成,[Cipher](#cipher)实例状态被清除。因此,后续开启新流程时,需重新调用init并传入完整参数列表进行初始化。 3935> 3936> 即使是对同一个Cipher实例,使用相同对称密钥,进行加密后解密时,调用init仍需填写params参数,不能省略为null。 3937> 2. 如果遇到解密失败,检查加解密数据和初始化时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec。 3938> 3. doFinal的结果可能为null,因此在使用.data字段访问doFinal结果的具体数据前,请先判断结果是否为null,以避免产生异常。 3939> 3940> 对于加密,CFB、OFB 和 CTR 模式,如果doFinal传入null,则返回结果为null。 3941> 3942> 对于解密,GCM、CCM、CFB、OFB和CTR模式,如果doFinal传null,则返回结果为null;对于其他模式,如果明文是加密块大小的整倍数,调用update传入所有密文,调用doFinal传null, 则返回结果为null。 3943> 4. 非对称加解密时多次doFinal操作的示例代码详见[使用RSA非对称密钥分段加解密](../../security/CryptoArchitectureKit/crypto-rsa-asym-encrypt-decrypt-by-segment.md),SM2和RSA的操作类似。 3944 3945**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 3946 3947**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 3948 3949API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 3950 3951**参数:** 3952 3953| 参数名 | 类型 | 必填 | 说明 | 3954| ---- | --------------------- | ---- | -------------------- | 3955| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 加密或者解密的数据。data参数允许为null,但不允许传入{data: Uint8Array(空) }。API 10之前只支持DataBlob,API 10之后增加支持null。 | 3956 3957**返回值:** 3958 3959| 类型 | 说明 | 3960| ------------------------------- | ------------------------------------------------ | 3961| Promise\<[DataBlob](#datablob)> | Promise对象,返回剩余数据的加/解密结果DataBlob。 | 3962 3963**错误码:** 3964以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 3965 3966| 错误码ID | 错误信息 | 3967| -------- | -------------------------------------------- | 3968| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 3969| 17620001 | memory operation failed. | 3970| 17620002 | failed to convert parameters between arkts and c. | 3971| 17630001 | crypto operation error. | 3972 3973**以AES GCM模式加密为例:** 3974 3975此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 3976 3977```ts 3978import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 3979import { buffer } from '@kit.ArkTS'; 3980 3981function generateRandom(len: number) { 3982 let rand = cryptoFramework.createRandom(); 3983 let generateRandSync = rand.generateRandomSync(len); 3984 return generateRandSync; 3985} 3986 3987function genGcmParamsSpec() { 3988 let ivBlob = generateRandom(12); 3989 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 3990 let dataAad = new Uint8Array(arr); 3991 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 3992 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 3993 let dataTag = new Uint8Array(arr); 3994 let tagBlob: cryptoFramework.DataBlob = { 3995 data: dataTag 3996 }; 3997 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 3998 iv: ivBlob, 3999 aad: aadBlob, 4000 authTag: tagBlob, 4001 algName: "GcmParamsSpec" 4002 }; 4003 return gcmParamsSpec; 4004} 4005 4006async function cipherByPromise() { 4007 let gcmParams = genGcmParamsSpec(); 4008 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 4009 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 4010 let symKey = await symKeyGenerator.generateSymKey(); 4011 await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams); 4012 let message = "This is a test"; 4013 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 4014 let encryptUpdate = await cipher.update(plainText); 4015 gcmParams.authTag = await cipher.doFinal(null); 4016 console.info('encryptUpdate plainText: ' + encryptUpdate.data); 4017} 4018``` 4019 4020### doFinalSync<sup>12+</sup> 4021 4022doFinalSync(data: DataBlob | null): DataBlob 4023 4024(1)在对称加解密中,doFinalSync用于处理剩余数据和本次传入的数据,并结束加密或解密操作,通过注册回调函数获取加密或解密结果。 4025 4026如果数据量较小,可以在doFinalSync中一次性传入数据,而不使用updateSync。如果在本次加解密流程中已经使用[updateSync](#updatesync12)传入过数据,可以在doFinalSync的data参数处传入null。 4027 4028根据对称加解密的模式不同,doFinalSync的输出有以下区别: 4029 4030- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每次updateSync和doFinalSync的结果拼接起来,会得到“密文 + authTag”。即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,其余部分均为密文。也就是说,如果doFinalSync的data参数传入null,则doFinalSync的结果就是 authTag。 4031 4032 authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。 4033- 对于其他模式的对称加解密以及GCM和CCM模式的对称解密:在一次加/解密流程中,每次updateSync和doFinalSync的结果拼接起来,得到完整的明文或密文。 4034 4035(2)在RSA和SM2非对称加解密中,doFinalSync用于加解密本次传入的数据,通过注册回调函数获取加密或解密后的数据。如果数据量超过单次处理能力,可以多次调用doFinalSync,并将结果拼接以获得完整的明文或密文。 4036 4037其他注意事项同接口[doFinal()](#dofinal)说明。 4038 4039**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4040 4041**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 4042 4043**参数:** 4044 4045| 参数名 | 类型 | 必填 | 说明 | 4046| ------ | ------------------------------------------- | ---- | ------------------------------------------------------------ | 4047| data | [DataBlob](#datablob) \| null| 是 | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data: Uint8Array(空) }。 | 4048 4049**返回值:** 4050 4051| 类型 | 说明 | 4052| ------------------------------- | ------------------------------------------------ | 4053| [DataBlob](#datablob) | 返回剩余数据的加/解密结果DataBlob。 | 4054 4055**错误码:** 4056以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 4057 4058| 错误码ID | 错误信息 | 4059| -------- | ----------------------- | 4060| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4061| 17620001 | memory operation failed. | 4062| 17620002 | failed to convert parameters between arkts and c. | 4063| 17630001 | crypto operation error. | 4064 4065**以AES GCM模式加密为例:** 4066 4067此外,更多加解密流程的完整示例可参考[加解密开发指导](../../security/CryptoArchitectureKit/crypto-aes-sym-encrypt-decrypt-gcm.md)。 4068 4069```ts 4070import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4071import { buffer } from '@kit.ArkTS'; 4072 4073function generateRandom(len: number) { 4074 let rand = cryptoFramework.createRandom(); 4075 let generateRandSync = rand.generateRandomSync(len); 4076 return generateRandSync; 4077} 4078 4079function genGcmParamsSpec() { 4080 let ivBlob = generateRandom(12); 4081 let arr = [1, 2, 3, 4, 5, 6, 7, 8]; 4082 let dataAad = new Uint8Array(arr); 4083 let aadBlob: cryptoFramework.DataBlob = { data: dataAad }; 4084 arr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; 4085 let dataTag = new Uint8Array(arr); 4086 let tagBlob: cryptoFramework.DataBlob = { 4087 data: dataTag 4088 }; 4089 let gcmParamsSpec: cryptoFramework.GcmParamsSpec = { 4090 iv: ivBlob, 4091 aad: aadBlob, 4092 authTag: tagBlob, 4093 algName: "GcmParamsSpec" 4094 }; 4095 return gcmParamsSpec; 4096} 4097 4098async function cipherBySync() { 4099 let gcmParams = genGcmParamsSpec(); 4100 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 4101 let cipher = cryptoFramework.createCipher('AES128|GCM|PKCS7'); 4102 let symKey = await symKeyGenerator.generateSymKey(); 4103 await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, gcmParams); 4104 let message = "This is a test"; 4105 let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; 4106 let encryptUpdate = cipher.updateSync(plainText); 4107 gcmParams.authTag = cipher.doFinalSync(null); 4108 console.info('encryptUpdate plainText: ' + encryptUpdate.data); 4109} 4110 4111``` 4112 4113### setCipherSpec<sup>10+</sup> 4114 4115setCipherSpec(itemType: CipherSpecItem, itemValue: Uint8Array): void 4116 4117设置加解密参数。常用的加解密参数可以直接通过[createCipher](#cryptoframeworkcreatecipher) 来指定,剩余参数可以通过本接口指定。当前只支持RSA算法。 4118 4119**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4120 4121**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 4122 4123API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 4124 4125**参数:** 4126 4127| 参数名 | 类型 | 必填 | 说明 | 4128| -------- | -------------------- | ---- | ---------- | 4129| itemType | [CipherSpecItem](#cipherspecitem10) | 是 | 用于指定需要设置的加解密参数。 | 4130| itemValue | Uint8Array | 是 | 用于指定加解密参数的具体值。 | 4131 4132**错误码:** 4133以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 4134 4135| 错误码ID | 错误信息 | 4136| -------- | ---------------------- | 4137| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4138| 801 | this operation is not supported. | 4139| 17620001 | memory operation failed. | 4140| 17630001 | crypto operation error. | 4141 4142**示例:** 4143 4144```ts 4145import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4146function testsetCipherSpec() { 4147 let cipher = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1"); 4148 let pSource = new Uint8Array([1,2,3,4]); 4149 cipher.setCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MGF1_PSRC_UINT8ARR, pSource); 4150} 4151``` 4152 4153### getCipherSpec<sup>10+</sup> 4154 4155getCipherSpec(itemType: CipherSpecItem): string | Uint8Array 4156 4157获取加解密参数。当前只支持RSA算法和SM2算法,从API version 11开始,支持SM2算法获取加解密参数。 4158 4159**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4160 4161**系统能力:** SystemCapability.Security.CryptoFramework.Cipher 4162 4163API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Cipher。 4164 4165**参数:** 4166 4167| 参数名 | 类型 | 必填 | 说明 | 4168| ------ | -------- | ---- | ---------- | 4169| itemType | [CipherSpecItem](#cipherspecitem10) | 是 | 用于指定需要获取的加解密参数。 | 4170 4171**返回值:** 4172 4173| 类型 | 说明 | 4174| -------------- | ----------- | 4175| string \| Uint8Array | 获取的加解密参数的具体值。 | 4176 4177**错误码:** 4178以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4179 4180| 错误码ID | 错误信息 | 4181| -------- | ---------------------- | 4182| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4183| 801 | this operation is not supported. | 4184| 17620001 | memory operation failed. | 4185| 17630001 | crypto operation error. | 4186 4187**示例:** 4188 4189```ts 4190import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4191 4192function testGetCipherSpec() { 4193 let cipher = cryptoFramework.createCipher("RSA2048|PKCS1_OAEP|SHA256|MGF1_SHA1"); 4194 let mdName = cipher.getCipherSpec(cryptoFramework.CipherSpecItem.OAEP_MD_NAME_STR); 4195 console.info('getCipherSpec: mdName =' + mdName); 4196} 4197``` 4198 4199## cryptoFramework.createSign 4200 4201createSign(algName: string): Sign 4202 4203生成Sign实例。 4204 4205支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。 4206 4207**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4208 4209**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4210 4211API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4212 4213**参数:** 4214 4215| 参数名 | 类型 | 必填 | 说明 | 4216| ------- | ------ | ---- | ------------------------------------------------------------ | 4217| algName | string | 是 | 指定签名算法:RSA、ECC、DSA、SM2<sup>10+</sup>或Ed25519<sup>11+</sup>。使用RSA PKCS1模式时需设置摘要;使用RSA PSS模式时需设置摘要和掩码摘要。签名时,通过设置OnlySign参数可传入数据摘要仅作签名。 | 4218 4219**返回值**: 4220 4221| 类型 | 说明 | 4222| ---- | ---------------------------------- | 4223| [Sign](#sign) | 返回由输入算法指定生成的Sign对象。 | 4224 4225**错误码:** 4226以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 4227 4228| 错误码ID | 错误信息 | 4229| -------- | ---------------------- | 4230| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4231| 801 | this operation is not supported. | 4232| 17620001 | memory operation failed. | 4233 4234**示例:** 4235 4236```ts 4237import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4238 4239let signer1 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 4240 4241let signer2 = cryptoFramework.createSign('RSA1024|PSS|SHA256|MGF1_SHA256'); 4242 4243let signer3 = cryptoFramework.createSign('ECC224|SHA256'); 4244 4245let signer4 = cryptoFramework.createSign('DSA2048|SHA256'); 4246 4247let signer5 = cryptoFramework.createSign('RSA1024|PKCS1|SHA256|OnlySign'); 4248``` 4249 4250## Sign 4251 4252Sign类,使用Sign方法之前需要创建该类的实例进行操作,通过[createSign(algName: string): Sign](#cryptoframeworkcreatesign)方法构造此实例。按序调用本类中的init、update、sign方法完成签名操作。签名操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4253 4254Sign类不支持重复初始化,当业务方需要使用新密钥签名时,需要重新创建新Sign对象并调用init初始化。 4255 4256业务方使用时,调用createSign接口确定签名的模式,调用init接口设置密钥。 4257 4258当待签名数据长度较短时,可在初始化后直接调用sign接口传入数据进行签名,无需调用update。 4259 4260当待签名数据较长时,可通过update接口分段传入切分后的原文数据,最后调用sign接口对整体原文数据进行签名。 4261 4262当使用update分段传入原文时,sign接口API 10之前只支持传入DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用sign进行签名。 4263 4264使用DSA算法签名时,如果摘要算法设置为NoHash,则不支持update操作,调用update接口将返回错误码ERR_CRYPTO_OPERATION。 4265 4266### 属性 4267 4268**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4269 4270**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4271 4272API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4273 4274| 名称 | 类型 | 只读 | 可选 | 说明 | 4275| ------- | ------ | ---- | ---- | ---------------------------- | 4276| algName | string | 是 | 否 | 签名指定的算法名称。 | 4277 4278### init 4279 4280init(priKey: PriKey, callback: AsyncCallback\<void>): void 4281 4282使用私钥初始化Sign对象,通过注册回调函数获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。 4283 4284Sign类不支持重复初始化。 4285 4286**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4287 4288**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4289 4290API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4291 4292**参数:** 4293 4294| 参数名 | 类型 | 必填 | 说明 | 4295| -------- | -------------------- | ---- | ---------------- | 4296| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 4297| callback | AsyncCallback\<void> | 是 | 回调函数。当签名初始化成功,err为undefined,否则为错误对象。 | 4298 4299**错误码:** 4300以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4301 4302| 错误码ID | 错误信息 | 4303| -------- | ---------------------- | 4304| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4305| 17620001 | memory operation failed. | 4306| 17620002 | failed to convert parameters between arkts and c. | 4307| 17630001 | crypto operation error. | 4308 4309### init 4310 4311init(priKey: PriKey): Promise\<void> 4312 4313使用私钥初始化Sign对象,通过Promise获取结果。init、update、sign为三段式接口,需要成组使用。其中init和sign必选,update可选。 4314 4315Sign类不支持重复初始化。 4316 4317**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4318 4319**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4320 4321API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4322 4323**参数:** 4324 4325| 参数名 | 类型 | 必填 | 说明 | 4326| ------ | ---- | ---- | ---------------- | 4327| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 4328 4329**返回值:** 4330 4331| 类型 | 说明 | 4332| -------------- | ------------- | 4333| Promise\<void> | 无返回结果的Promise对象。 | 4334 4335**错误码:** 4336以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4337 4338| 错误码ID | 错误信息 | 4339| -------- | ---------------------- | 4340| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4341| 17620001 | memory operation failed. | 4342| 17620002 | failed to convert parameters between arkts and c. | 4343| 17630001 | crypto operation error. | 4344 4345### initSync<sup>12+</sup> 4346 4347initSync(priKey: PriKey): void 4348 4349使用私钥初始化Sign对象,通过同步方式获取结果。initSync、updateSync、signSync为三段式接口,需要成组使用。其中initSync和signSync必选,updateSync可选。 4350 4351Sign类不支持重复调用initSync。 4352 4353**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4354 4355**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4356 4357**参数:** 4358 4359| 参数名 | 类型 | 必填 | 说明 | 4360| ------ | ---- | ---- | ---------------- | 4361| priKey | [PriKey](#prikey) | 是 | 用于Sign的初始化。 | 4362 4363**错误码:** 4364以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4365 4366| 错误码ID | 错误信息 | 4367| -------- | ---------------------- | 4368| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4369| 17620001 | memory operation failed. | 4370| 17620002 | failed to convert parameters between arkts and c. | 4371| 17630001 | crypto operation error. | 4372 4373### update 4374 4375update(data: DataBlob, callback: AsyncCallback\<void>): void 4376 4377追加待签名数据,通过注册回调函数完成更新。 4378 4379必须在对[Sign](#sign)实例使用[init()](#init-2)初始化后,才能使用本函数。 4380 4381> **说明:** 4382> 4383> 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[sign](#sign-1))或多次调用update。<br/> 4384> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 4385> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4386> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/> 4387> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4388 4389**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4390 4391**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4392 4393API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4394 4395**参数:** 4396 4397| 参数名 | 类型 | 必填 | 说明 | 4398| -------- | --------------------- | ---- | ------------ | 4399| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4400| callback | AsyncCallback\<void> | 是 | 回调函数。当签名更新成功,err为undefined,否则为错误对象。| 4401 4402**错误码:** 4403以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 4404 4405| 错误码ID | 错误信息 | 4406| -------- | ---------------------- | 4407| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4408| 17620001 | memory operation failed. | 4409| 17620002 | failed to convert parameters between arkts and c. | 4410| 17630001 | crypto operation error. | 4411 4412### update 4413 4414update(data: DataBlob): Promise\<void> 4415 4416追加待签名数据,通过Promise方式完成更新。 4417 4418在使用本函数前,必须先使用[Sign](#sign)方法对[init()](#init-3)实例进行初始化。 4419 4420> **说明:** 4421> 4422> 根据数据量,可以不调用update(即[init](#init-3)完成后直接调用[sign](#sign-2))或多次调用update。<br/> 4423> 算法库不对单次或累计的update数据量设置大小限制。建议在处理大数据量的签名操作时,采用多次update方式传入数据,以避免一次性申请过多内存。 4424> 签名使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4425> OnlySign模式下,不支持update操作,需要直接使用sign传入数据。<br/> 4426> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4427 4428**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4429 4430**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4431 4432API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4433 4434**参数:** 4435 4436| 参数名 | 类型 | 必填 | 说明 | 4437| ------ | -------- | ---- | ---------- | 4438| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4439 4440**返回值:** 4441 4442| 类型 | 说明 | 4443| -------------- | ------------- | 4444| Promise\<void> | 无返回结果的Promise对象。 | 4445 4446**错误码:** 4447以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。 4448 4449| 错误码ID | 错误信息 | 4450| -------- | ---------------------- | 4451| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4452| 17620001 | memory operation failed. | 4453| 17620002 | failed to convert parameters between arkts and c. | 4454| 17630001 | crypto operation error. | 4455 4456### updateSync<sup>12+</sup> 4457 4458updateSync(data: DataBlob): void 4459 4460追加待签名数据,通过同步方式完成更新。 4461 4462必须在对[Sign](#sign)实例使用[initSync()](#initsync12-1)初始化后,才能使用本函数。 4463 4464> **说明:** 4465> 4466> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-1)完成后直接调用[signSync](#signsync12))或多次调用updateSync。<br/> 4467> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的签名操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/> 4468> 签名使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4469> OnlySign模式下,不支持updateSync操作,需要直接使用signSync传入数据。<br/> 4470> 当使用DSA算法进行签名,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。 4471 4472**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4473 4474**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4475 4476**参数:** 4477 4478| 参数名 | 类型 | 必填 | 说明 | 4479| ------ | -------- | ---- | ---------- | 4480| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4481 4482**返回值:** 4483 4484| 类型 | 说明 | 4485| -------------- | ------------- | 4486| void | 无返回结果。 | 4487 4488**错误码:** 4489以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。 4490 4491| 错误码ID | 错误信息 | 4492| -------- | ---------------------- | 4493| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4494| 17620001 | memory operation failed. | 4495| 17620002 | failed to convert parameters between arkts and c. | 4496| 17630001 | crypto operation error. | 4497 4498### sign 4499 4500sign(data: DataBlob | null, callback: AsyncCallback\<DataBlob>): void 4501 4502对数据进行签名,通过注册回调函数获取签名结果。 4503 4504**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4505 4506**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4507 4508API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4509 4510**参数:** 4511 4512| 参数名 | 类型 | 必填 | 说明 | 4513| -------- | -------------------- | ---- | ---------- | 4514| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 4515| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 4516 4517**错误码:** 4518以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 4519 4520| 错误码ID | 错误信息 | 4521| -------- | ---------------------- | 4522| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4523| 17620001 | memory operation failed. | 4524| 17620002 | failed to convert parameters between arkts and c. | 4525| 17630001 | crypto operation error. | 4526 4527### sign 4528 4529sign(data: DataBlob | null): Promise\<DataBlob> 4530 4531对数据进行签名,通过Promise方式返回签名结果。 4532 4533**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4534 4535**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4536 4537API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4538 4539**参数:** 4540 4541| 参数名 | 类型 | 必填 | 说明 | 4542| ------ | -------- | ---- | ---------- | 4543| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。 | 4544 4545**返回值:** 4546 4547| 类型 | 说明 | 4548| -------------- | ------------- | 4549| Promise\<[DataBlob](#datablob)> | 返回签名结果。 | 4550 4551**错误码:** 4552以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4553 4554| 错误码ID | 错误信息 | 4555| -------- | ---------------------- | 4556| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4557| 17620001 | memory operation failed. | 4558| 17620002 | failed to convert parameters between arkts and c. | 4559| 17630001 | crypto operation error. | 4560 4561### signSync<sup>12+</sup> 4562 4563signSync(data: DataBlob | null): DataBlob 4564 4565对数据进行签名,通过同步方式返回签名结果。 4566 4567**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4568 4569**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4570 4571**参数:** 4572 4573| 参数名 | 类型 | 必填 | 说明 | 4574| ------ | -------- | ---- | ---------- | 4575| data | [DataBlob](#datablob) \| null | 是 | 传入的消息。 | 4576 4577**返回值:** 4578 4579| 类型 | 说明 | 4580| -------------- | ------------- | 4581| [DataBlob](#datablob) | 返回签名结果。 | 4582 4583**错误码:** 4584以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4585 4586| 错误码ID | 错误信息 | 4587| -------- | ---------------------- | 4588| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4589| 17620001 | memory operation failed. | 4590| 17620002 | failed to convert parameters between arkts and c. | 4591| 17630001 | crypto operation error. | 4592 4593**callback示例:** 4594 4595此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4596 4597```ts 4598import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4599import { buffer } from '@kit.ArkTS'; 4600 4601function signByCallback() { 4602 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4603 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4604 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]); 4605 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]); 4606 let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData }; 4607 let priKeyBlob: cryptoFramework.DataBlob = { data: skData }; 4608 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4609 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 4610 rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 4611 signer.init(keyPair.priKey, err => { 4612 signer.update(inputUpdate, err => { 4613 signer.sign(inputVerify, (err, signData) => { 4614 console.info('sign output is ' + signData.data); 4615 }); 4616 }); 4617 }); 4618 }); 4619} 4620``` 4621 4622**Promise示例:** 4623 4624此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4625 4626```ts 4627import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4628import { buffer } from '@kit.ArkTS'; 4629 4630async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 4631 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 4632 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 4633 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4634 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 4635 console.info('convertKey success'); 4636 return keyPair; 4637} 4638 4639async function signByPromise() { 4640 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]); 4641 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]); 4642 let keyPair = await genKeyPairByData(pkData, skData); 4643 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4644 let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4645 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 4646 await signer.init(keyPair.priKey); 4647 await signer.update(inputUpdate); 4648 let signData = await signer.sign(inputSign); 4649 console.info('signData result: ' + signData.data); 4650} 4651``` 4652 4653**Sync示例:** 4654 4655此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4656 4657```ts 4658import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4659import { buffer } from '@kit.ArkTS'; 4660 4661function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 4662 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 4663 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 4664 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 4665 let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 4666 console.info('convertKeySync success'); 4667 return keyPair; 4668} 4669 4670function signBySync() { 4671 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]); 4672 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]); 4673 let keyPair = genKeyPairByData(pkData, skData); 4674 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 4675 let inputSign: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 4676 let signer = cryptoFramework.createSign('RSA1024|PKCS1|SHA256'); 4677 signer.initSync(keyPair.priKey); 4678 signer.updateSync(inputUpdate); 4679 let signData = signer.signSync(inputSign); 4680 console.info('signData result: ' + signData.data); 4681} 4682``` 4683 4684### setSignSpec<sup>10+</sup> 4685 4686setSignSpec(itemType: SignSpecItem, itemValue: number): void 4687 4688setSignSpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void 4689 4690设置签名参数。常用签名参数可通过 [createSign](#cryptoframeworkcreatesign) 指定,其他参数则通过本接口设置。 4691 4692 4693只支持RSA算法、SM2算法,从API version11开始,支持SM2算法设置签名参数。 4694 4695**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4696 4697**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4698 4699API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4700 4701**参数:** 4702 4703| 参数名 | 类型 | 必填 | 说明 | 4704| -------- | -------------------- | ---- | ---------- | 4705| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要设置的签名参数。 | 4706| itemValue | number \| Uint8Array<sup>11+</sup> | 是 | 用于指定签名参数的具体值。 | 4707 4708**错误码:** 4709以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4710 4711| 错误码ID | 错误信息 | 4712| -------- | ---------------------- | 4713| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4714| 801 | this operation is not supported. | 4715| 17620001 | memory operation failed. | 4716| 17630001 | crypto operation error. | 4717 4718**示例:** 4719 4720```ts 4721import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4722 4723function testSetSignSpec() { 4724 let signer = cryptoFramework.createSign("RSA|PSS|SHA256|MGF1_SHA256"); 4725 let setN = 20; 4726 signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN); 4727} 4728``` 4729 4730### getSignSpec<sup>10+</sup> 4731 4732getSignSpec(itemType: SignSpecItem): string | number 4733 4734获取签名参数。当前仅支持RSA算法。 4735 4736**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4737 4738**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4739 4740API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4741 4742**参数:** 4743 4744| 参数名 | 类型 | 必填 | 说明 | 4745| ------ | -------- | ---- | ---------- | 4746| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要获取的签名参数。 | 4747 4748**返回值:** 4749 4750| 类型 | 说明 | 4751| -------------- | ----------- | 4752| string \| number | 获取的签名参数的具体值。 | 4753 4754**错误码:** 4755以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4756 4757| 错误码ID | 错误信息 | 4758| -------- | ---------------------- | 4759| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4760| 801 | this operation is not supported. | 4761| 17620001 | memory operation failed. | 4762| 17630001 | crypto operation error. | 4763 4764**示例:** 4765 4766```ts 4767import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4768 4769function testGetSignSpec() { 4770 let signer = cryptoFramework.createSign("RSA|PSS|SHA256|MGF1_SHA256"); 4771 let setN = 32; 4772 signer.setSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN); 4773 let saltLen = signer.getSignSpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM); 4774} 4775``` 4776 4777## cryptoFramework.createVerify 4778 4779createVerify(algName: string): Verify 4780 4781生成Verify实例。 4782 4783支持的规格详见[签名验签规格](../../security/CryptoArchitectureKit/crypto-sign-sig-verify-overview.md)。 4784 4785**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4786 4787**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4788 4789API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4790 4791**参数:** 4792 4793| 参数名 | 类型 | 必填 | 说明 | 4794| ------- | ------ | ---- | ------------------------------------------------------------ | 4795| algName | string | 是 | 指定签名算法:RSA、ECC、DSA、SM2<sup>10+</sup>或Ed25519<sup>11+</sup>。使用RSA PKCS1模式时需设置摘要;使用RSA PSS模式时需设置摘要和掩码摘要。使用RSA算法验签时,设置Recover参数可支持验签恢复。 | 4796 4797**返回值**: 4798 4799| 类型 | 说明 | 4800| ------ | ------------------------------------ | 4801| Verify | 返回由输入算法指定生成的Verify对象。 | 4802 4803**错误码:** 4804以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 4805 4806| 错误码ID | 错误信息 | 4807| -------- | ---------------------- | 4808| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4809| 801 | this operation is not supported. | 4810| 17620001 | memory operation failed. | 4811 4812**示例:** 4813 4814```ts 4815import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 4816 4817let verifier1 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 4818 4819let verifier2 = cryptoFramework.createVerify('RSA1024|PSS|SHA256|MGF1_SHA256'); 4820 4821let verifier3 = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover'); 4822``` 4823 4824## Verify 4825 4826Verify类,使用Verify方法之前需要创建该类的实例进行操作,通过[createVerify(algName: string): Verify](#cryptoframeworkcreateverify)方法构造此实例。按序调用本类中的init、update、verify方法完成签名操作。验签操作的示例代码详见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 4827 4828Verify类不支持重复初始化,当业务方需要使用新密钥验签时,需要重新创建新Verify对象并调用init初始化。 4829 4830业务方使用时,在createVerify时确定验签的模式,调用init接口设置密钥。 4831 4832当被签名的消息较短时,可在init初始化后,(无需update)直接调用verify接口传入被签名的消息和签名(signatureData)进行验签。 4833 4834当被签名的消息较长时,可通过update接口分段传入被签名的消息,最后调用verify接口对消息全文进行验签。verify接口的data入参在API 10之前只支持DataBlob, API 10之后增加支持null。业务方可在循环中调用update接口,循环结束后调用verify传入签名(signatureData)进行验签。 4835 4836当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4837 4838### 属性 4839 4840**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4841 4842**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4843 4844API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4845 4846| 名称 | 类型 | 只读 | 可选 | 说明 | 4847| ------- | ------ | ---- | ---- | ---------------------------- | 4848| algName | string | 是 | 否 | 验签指定的算法名称。 | 4849 4850### init 4851 4852init(pubKey: PubKey, callback: AsyncCallback\<void>): void 4853 4854传入公钥初始化Verify对象,通过注册回调函数获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。 4855 4856**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4857 4858**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4859 4860API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4861 4862**参数:** 4863 4864| 参数名 | 类型 | 必填 | 说明 | 4865| -------- | -------------------- | ---- | ------------------------------ | 4866| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4867| callback | AsyncCallback\<void> | 是 | 回调函数。当验签初始化成功,err为undefined,否则为错误对象。 | 4868 4869**错误码:** 4870以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4871 4872| 错误码ID | 错误信息 | 4873| -------- | ---------------------- | 4874| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4875| 17620001 | memory operation failed. | 4876| 17620002 | failed to convert parameters between arkts and c. | 4877| 17630001 | crypto operation error. | 4878 4879### init 4880 4881init(pubKey: PubKey): Promise\<void> 4882 4883传入公钥初始化Verify对象,通过Promise获取结果。init、update、verify为三段式接口,需要成组使用。其中init和verify必选,update可选。 4884 4885**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4886 4887**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4888 4889API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4890 4891**参数:** 4892 4893| 参数名 | 类型 | 必填 | 说明 | 4894| ------ | ---- | ---- | ---------------------------- | 4895| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4896 4897**返回值:** 4898 4899| 类型 | 说明 | 4900| -------------- | ------------- | 4901| Promise\<void> | 无返回结果的Promise对象。 | 4902 4903**错误码:** 4904以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 4905 4906| 错误码ID | 错误信息 | 4907| -------- | ---------------------- | 4908| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4909| 17620001 | memory operation failed. | 4910| 17620002 | failed to convert parameters between arkts and c. | 4911| 17630001 | crypto operation error. | 4912 4913### initSync<sup>12+</sup> 4914 4915initSync(pubKey: PubKey): void 4916 4917传入公钥初始化Verify对象,通过同步方式获取结果。initSync、updateSync、verifySync为三段式接口,需要成组使用。其中initSync和verifySync必选,updateSync可选。 4918 4919**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4920 4921**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4922 4923**参数:** 4924 4925| 参数名 | 类型 | 必填 | 说明 | 4926| ------ | ---- | ---- | ---------------------------- | 4927| pubKey | [PubKey](#pubkey) | 是 | 公钥对象,用于Verify的初始化。 | 4928 4929**返回值:** 4930 4931| 类型 | 说明 | 4932| -------------- | ------------- | 4933| void | 无返回结果。 | 4934 4935**错误码:** 4936以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 4937 4938| 错误码ID | 错误信息 | 4939| -------- | ---------------------- | 4940| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4941| 17620001 | memory operation failed. | 4942| 17620002 | failed to convert parameters between arkts and c. | 4943| 17630001 | crypto operation error. | 4944 4945### update 4946 4947update(data: DataBlob, callback: AsyncCallback\<void>): void 4948 4949追加待验签数据,通过注册回调函数完成更新。 4950 4951必须在对[Verify](#verify)实例使用[init](#init-4)初始化后,才能使用本函数。 4952 4953> **说明:** 4954> 4955> 根据数据量,可以不调用update(即[init](#init-4)完成后直接调用[verify](#verify-1))或多次调用update。<br/> 4956> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 4957> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4958> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4959 4960**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4961 4962**系统能力:** SystemCapability.Security.CryptoFramework.Signature 4963 4964API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 4965 4966**参数:** 4967 4968| 参数名 | 类型 | 必填 | 说明 | 4969| -------- | --------------------- | ---- | ------------ | 4970| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 4971| callback | AsyncCallback\<void> | 是 | 回调函数。当验签更新成功,err为undefined,否则为错误对象。| 4972 4973**错误码:** 4974以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 4975 4976| 错误码ID | 错误信息 | 4977| -------- | ---------------------- | 4978| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 4979| 17620001 | memory operation failed. | 4980| 17620002 | failed to convert parameters between arkts and c. | 4981| 17630001 | crypto operation error. | 4982 4983### update 4984 4985update(data: DataBlob): Promise\<void> 4986 4987追加待验签数据,通过Promise方式完成更新。 4988 4989必须在对[Verify](#verify)实例使用[init()](#init-5)初始化后,才能使用本函数。 4990 4991> **说明:** 4992> 4993> 根据数据量,可以不调用update(即[init](#init-5)完成后直接调用[verify](#verify-2))或多次调用update。<br/> 4994> 算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次update的方式传入数据,避免一次性申请过大内存。<br/> 4995> 验签使用多次update操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 4996> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持update操作,update接口会返回错误码ERR_CRYPTO_OPERATION。 4997 4998**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 4999 5000**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5001 5002API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 5003 5004**参数:** 5005 5006| 参数名 | 类型 | 必填 | 说明 | 5007| ------ | -------- | ---- | ---------- | 5008| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 5009 5010**返回值:** 5011 5012| 类型 | 说明 | 5013| -------------- | ------------- | 5014| Promise\<void> | 无返回结果的Promise对象。 | 5015 5016**错误码:** 5017以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5018 5019| 错误码ID | 错误信息 | 5020| -------- | ---------------------- | 5021| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5022| 17620001 | memory operation failed. | 5023| 17620002 | failed to convert parameters between arkts and c. | 5024| 17630001 | crypto operation error. | 5025 5026### updateSync<sup>12+</sup> 5027 5028updateSync(data: DataBlob): void 5029 5030追加待验签数据,通过同步方式完成更新。 5031 5032必须在对[Verify](#verify)实例使用[initSync()](#initsync12-2)初始化后,才能使用本函数。 5033 5034> **说明:** 5035> 5036> 根据数据量,可以不调用updateSync(即[initSync](#initsync12-2)完成后直接调用[verifySync](#verifysync12))或多次调用updateSync。<br/> 5037> 算法库目前没有对updateSync(单次或累计)的数据量设置大小限制,建议对于大数据量的验签操作,采用多次updateSync的方式传入数据,避免一次性申请过大内存。<br/> 5038> 验签使用多次updateSync操作的示例代码详见[使用RSA密钥对分段签名验签](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1-by-segment.md),其余算法操作类似。<br/> 5039> 当使用DSA算法进行验签,并设置了摘要算法为NoHash时,则不支持updateSync操作,updateSync接口会返回错误码ERR_CRYPTO_OPERATION。 5040 5041**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5042 5043**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5044 5045**参数:** 5046 5047| 参数名 | 类型 | 必填 | 说明 | 5048| ------ | -------- | ---- | ---------- | 5049| data | [DataBlob](#datablob) | 是 | 传入的消息。 | 5050 5051**返回值:** 5052 5053| 类型 | 说明 | 5054| -------------- | ------------- | 5055| void | 无返回结果。 | 5056 5057**错误码:** 5058以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 5059 5060| 错误码ID | 错误信息 | 5061| -------- | ---------------------- | 5062| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5063| 17620001 | memory operation failed. | 5064| 17620002 | failed to convert parameters between arkts and c. | 5065| 17630001 | crypto operation error. | 5066 5067### verify 5068 5069verify(data: DataBlob | null, signatureData: DataBlob, callback: AsyncCallback\<boolean>): void 5070 5071对数据进行验签,通过注册回调函数返回验签结果。 5072 5073**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5074 5075**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5076 5077API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 5078 5079**参数:** 5080 5081| 参数名 | 类型 | 必填 | 说明 | 5082| ------------- | -------------------- | ---- | ---------- | 5083| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 5084| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 5085| callback | AsyncCallback\<boolean> | 是 | 回调函数,用于获取以boolean值表示的验签结果。 | 5086 5087**错误码:** 5088以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5089 5090| 错误码ID | 错误信息 | 5091| -------- | ---------------------- | 5092| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5093| 17620001 | memory operation failed. | 5094| 17620002 | failed to convert parameters between arkts and c. | 5095| 17630001 | crypto operation error. | 5096 5097### verify 5098 5099verify(data: DataBlob | null, signatureData: DataBlob): Promise\<boolean> 5100 5101对数据进行验签,通过Promise返回验签结果。 5102 5103**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5104 5105**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5106 5107API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 5108 5109**参数:** 5110 5111| 参数名 | 类型 | 必填 | 说明 | 5112| ------------- | -------- | ---- | ---------- | 5113| data | [DataBlob](#datablob) \| null<sup>10+</sup> | 是 | 传入的消息。API 10之前只支持DataBlob, API 10之后增加支持null。 | 5114| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 5115 5116**返回值:** 5117 5118| 类型 | 说明 | 5119| ----------------- | ------------------------------ | 5120| Promise\<boolean> | 异步返回值,代表验签是否通过。 | 5121 5122**错误码:** 5123以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5124 5125| 错误码ID | 错误信息 | 5126| -------- | ---------------------- | 5127| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5128| 17620001 | memory operation failed. | 5129| 17620002 | failed to convert parameters between arkts and c. | 5130| 17630001 | crypto operation error. | 5131 5132### verifySync<sup>12+</sup> 5133 5134verifySync(data: DataBlob | null, signatureData: DataBlob): boolean 5135 5136对数据进行验签,通过同步方式返回验签结果。 5137 5138**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5139 5140**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5141 5142**参数:** 5143 5144| 参数名 | 类型 | 必填 | 说明 | 5145| ------------- | -------- | ---- | ---------- | 5146| data | [DataBlob](#datablob) \| null | 是 | 传入的消息。 | 5147| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 5148 5149**返回值:** 5150 5151| 类型 | 说明 | 5152| ----------------- | ------------------------------ | 5153| boolean | 同步返回值,表示验签是否成功。 | 5154 5155**错误码:** 5156以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5157 5158| 错误码ID | 错误信息 | 5159| -------- | ---------------------- | 5160| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5161| 17620001 | memory operation failed. | 5162| 17620002 | failed to convert parameters between arkts and c. | 5163| 17630001 | crypto operation error. | 5164 5165**callback示例:** 5166 5167此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 5168 5169```ts 5170import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5171import { buffer } from '@kit.ArkTS'; 5172 5173function verifyByCallback() { 5174 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 5175 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 5176 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过。 5177 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]); 5178 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]); 5179 let pubKeyBlob: cryptoFramework.DataBlob = { data: pkData }; 5180 let priKeyBlob: cryptoFramework.DataBlob = { data: skData }; 5181 // 该数据取自Sign中的signData.data。 5182 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]) } 5183 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 5184 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 5185 rsaGenerator.convertKey(pubKeyBlob, priKeyBlob, (err, keyPair) => { 5186 verifier.init(keyPair.pubKey, err => { 5187 verifier.update(inputUpdate, err => { 5188 verifier.verify(inputVerify, signMessageBlob, (err, res) => { 5189 console.info('verify result is ' + res); 5190 }); 5191 }); 5192 }); 5193 }); 5194} 5195``` 5196 5197**Promise示例:** 5198 5199更多示例请参见[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 5200 5201```ts 5202import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5203import { buffer } from '@kit.ArkTS'; 5204 5205async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 5206 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 5207 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 5208 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 5209 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 5210 console.info('convertKey success'); 5211 return keyPair; 5212} 5213 5214async function verifyByPromise() { 5215 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过。 5216 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]); 5217 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]); 5218 let keyPair = await genKeyPairByData(pkData, skData); 5219 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 5220 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 5221 // 该数据取自Sign中的signData.data。 5222 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]) }; 5223 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 5224 await verifier.init(keyPair.pubKey); 5225 await verifier.update(inputUpdate); 5226 let res = await verifier.verify(inputVerify, signMessageBlob); 5227 console.info('verify result: ' + res); 5228} 5229``` 5230 5231**Sync示例:** 5232 5233此外,更多签名验签的完整示例可参考[签名验签开发指导](../../security/CryptoArchitectureKit/crypto-rsa-sign-sig-verify-pkcs1.md)。 5234 5235```ts 5236import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5237import { buffer } from '@kit.ArkTS'; 5238 5239function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 5240 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 5241 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 5242 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 5243 let keyPair = rsaGenerator.convertKeySync(pubKeyBlob, priKeyBlob); 5244 console.info('convertKey success'); 5245 return keyPair; 5246} 5247 5248function verifyBySync() { 5249 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过。 5250 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]); 5251 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]); 5252 let keyPair = genKeyPairByData(pkData, skData); 5253 let inputUpdate: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan1", 'utf-8').buffer) }; 5254 let inputVerify: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("This is Sign test plan2", 'utf-8').buffer) }; 5255 // 该数据取自Sign中的signData.data。 5256 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]) }; 5257 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256'); 5258 verifier.initSync(keyPair.pubKey); 5259 verifier.updateSync(inputUpdate); 5260 let res = verifier.verifySync(inputVerify, signMessageBlob); 5261 console.info('verify result: ' + res); 5262} 5263``` 5264 5265### recover<sup>12+</sup> 5266 5267recover(signatureData: DataBlob): Promise\<DataBlob | null> 5268 5269对数据进行签名恢复原始数据,通过Promise返回恢复结果。 5270 5271> **说明:** 5272> 5273> - 目前仅RSA支持。 5274 5275**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5276 5277**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5278 5279**参数:** 5280 5281| 参数名 | 类型 | 必填 | 说明 | 5282| ------------- | -------- | ---- | ---------- | 5283| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 5284 5285**返回值:** 5286 5287| 类型 | 说明 | 5288| ----------------- | ------------------------------ | 5289| Promise\<[DataBlob](#datablob) \| null> | 验签恢复的数据。 | 5290 5291**错误码:** 5292以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 5293 5294| 错误码ID | 错误信息 | 5295| -------- | ---------------------- | 5296| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5297| 17620001 | memory operation failed. | 5298| 17620002 | failed to convert parameters between arkts and c. | 5299| 17630001 | crypto operation error. | 5300 5301**示例:** 5302 5303```ts 5304import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5305import { buffer } from '@kit.ArkTS'; 5306import { BusinessError } from '@kit.BasicServicesKit'; 5307 5308async function genKeyPairByData(pubKeyData: Uint8Array, priKeyData: Uint8Array) { 5309 let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKeyData }; 5310 let priKeyBlob: cryptoFramework.DataBlob = { data: priKeyData }; 5311 let rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); 5312 let keyPair = await rsaGenerator.convertKey(pubKeyBlob, priKeyBlob); 5313 console.info('convertKey success'); 5314 return keyPair; 5315} 5316 5317async function recoverByPromise() { 5318 // 根据密钥数据生成的密钥和输入的验签数据,这部分代码Verify与Sign中保持一致,保证验签通过。 5319 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]); 5320 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]); 5321 let keyPair = await genKeyPairByData(pkData, skData); 5322 // 该数据取自Sign中的signData.data。 5323 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]) }; 5324 let verifier = cryptoFramework.createVerify('RSA1024|PKCS1|SHA256|Recover'); 5325 await verifier.init(keyPair.pubKey); 5326 try { 5327 let rawSignData = await verifier.recover(signMessageBlob); 5328 if (rawSignData != null) { 5329 console.info('[Promise]: recover result: ' + rawSignData.data); 5330 } else { 5331 console.error("[Promise]: get verify recover result fail!"); 5332 } 5333 } catch (error) { 5334 let e: BusinessError = error as BusinessError; 5335 console.error(`promise error, ${e.code}, ${e.message}`); 5336 } 5337} 5338``` 5339 5340### recoverSync<sup>12+</sup> 5341 5342recoverSync(signatureData: DataBlob): DataBlob | null 5343 5344对数据进行签名恢复原始数据。 5345 5346> **说明:** 5347> 5348> - 目前仅RSA支持。 5349 5350**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5351 5352**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5353 5354**参数:** 5355 5356| 参数名 | 类型 | 必填 | 说明 | 5357| ------------- | -------- | ---- | ---------- | 5358| signatureData | [DataBlob](#datablob) | 是 | 签名数据。 | 5359 5360**返回值:** 5361 5362| 类型 | 说明 | 5363| ----------------- | ------------------------------ | 5364| [DataBlob](#datablob) \| null | 验签恢复的数据。 | 5365 5366**错误码:** 5367以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5368 5369| 错误码ID | 错误信息 | 5370| -------- | ---------------------- | 5371| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5372| 17620001 | memory operation failed. | 5373| 17620002 | failed to convert parameters between arkts and c. | 5374| 17630001 | crypto operation error. | 5375 5376### setVerifySpec<sup>10+</sup> 5377 5378setVerifySpec(itemType: SignSpecItem, itemValue: number): void 5379 5380setVerifySpec(itemType: SignSpecItem, itemValue: number \| Uint8Array): void 5381 5382设置验签参数。常用的签名参数可以直接通过[createVerify](#cryptoframeworkcreateverify) 来指定,剩余参数可以通过本接口指定。 5383 5384支持RSA算法和SM2算法,从API version 11开始,支持SM2算法设置验签参数。 5385 5386验签的参数应当与签名的参数保持一致。 5387 5388**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5389 5390**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5391 5392API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 5393 5394**参数:** 5395 5396| 参数名 | 类型 | 必填 | 说明 | 5397| -------- | -------------------- | ---- | ---------- | 5398| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要设置的验签参数。 | 5399| itemValue | number \| Uint8Array<sup>11+</sup> | 是 | 用于指定验签参数的具体值。 | 5400 5401**错误码:** 5402以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5403 5404| 错误码ID | 错误信息 | 5405| -------- | ---------------------- | 5406| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5407| 801 | this operation is not supported. | 5408| 17620001 | memory operation failed. | 5409| 17630001 | crypto operation error. | 5410 5411**示例:** 5412 5413```ts 5414import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5415 5416function testSetVerifySpec() { 5417 let verifier = cryptoFramework.createVerify("RSA2048|PSS|SHA256|MGF1_SHA256"); 5418 let setN = 20; 5419 verifier.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN); 5420} 5421``` 5422 5423### getVerifySpec<sup>10+</sup> 5424 5425getVerifySpec(itemType: SignSpecItem): string | number 5426 5427获取验签参数。当前只支持RSA算法。 5428 5429验签的参数应当与签名的参数保持一致。 5430 5431**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5432 5433**系统能力:** SystemCapability.Security.CryptoFramework.Signature 5434 5435API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Signature。 5436 5437**参数:** 5438 5439| 参数名 | 类型 | 必填 | 说明 | 5440| ------ | -------- | ---- | ---------- | 5441| itemType | [SignSpecItem](#signspecitem10) | 是 | 用于指定需要获取的验签参数。 | 5442 5443**返回值:** 5444 5445| 类型 | 说明 | 5446| -------------- | ----------- | 5447| string \| number | 获取的验签参数的具体值。 | 5448 5449**错误码:** 5450以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5451 5452| 错误码ID | 错误信息 | 5453| -------- | ---------------------- | 5454| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5455| 801 | this operation is not supported. | 5456| 17620001 | memory operation failed. | 5457| 17630001 | crypto operation error. | 5458 5459**示例:** 5460 5461```ts 5462import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5463 5464function testGetVerifySpec() { 5465 let verifier = cryptoFramework.createVerify("RSA2048|PSS|SHA256|MGF1_SHA256"); 5466 let setN = 20; 5467 verifier.setVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM, setN); 5468 let saltLen = verifier.getVerifySpec(cryptoFramework.SignSpecItem.PSS_SALT_LEN_NUM); 5469} 5470``` 5471 5472## cryptoFramework.createKeyAgreement 5473 5474createKeyAgreement(algName: string): KeyAgreement 5475 5476生成KeyAgreement实例。 5477 5478支持的规格详见[密钥协商规格](../../security/CryptoArchitectureKit/crypto-key-agreement-overview.md)。 5479 5480**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5481 5482**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 5483 5484API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.KeyAgreement。 5485 5486**参数:** 5487 5488| 参数名 | 类型 | 必填 | 说明 | 5489| ------- | ------ | ---- | ------------------------------------------------------------ | 5490| algName | string | 是 | 指定密钥协商算法:目前仅支持ECC,从API version 11开始,增加支持X25519和DH。 | 5491 5492**返回值**: 5493 5494| 类型 | 说明 | 5495| ------------ | ------------------------------------------ | 5496| KeyAgreement | 返回由输入算法指定生成的KeyAgreement对象。 | 5497 5498**错误码:** 5499以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5500 5501| 错误码ID | 错误信息 | 5502| -------- | ---------------------- | 5503| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5504| 801 | this operation is not supported. | 5505| 17620001 | memory operation failed. | 5506 5507**示例:** 5508 5509```ts 5510import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5511 5512let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 5513``` 5514 5515## KeyAgreement 5516 5517KeyAgreement类,使用密钥协商方法之前需要创建该类的实例进行操作,通过[createKeyAgreement(algName: string): KeyAgreement](#cryptoframeworkcreatekeyagreement)方法构造此实例。 5518 5519### 属性 5520 5521**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5522 5523**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 5524 5525API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.KeyAgreement。 5526 5527| 名称 | 类型 | 只读 | 可选 | 说明 | 5528| ------- | ------ | ---- | ---- | ---------------------------- | 5529| algName | string | 是 | 否 | 密钥协商指定的算法名称。 | 5530 5531### generateSecret 5532 5533generateSecret(priKey: PriKey, pubKey: PubKey, callback: AsyncCallback\<DataBlob>): void 5534 5535基于传入的私钥与公钥进行密钥协商,通过注册回调函数返回共享密钥。 5536 5537**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5538 5539**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 5540 5541API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.KeyAgreement。 5542 5543**参数:** 5544 5545| 参数名 | 类型 | 必填 | 说明 | 5546| -------- | ------------------------ | ---- | ---------------------- | 5547| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 5548| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 5549| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 异步接受共享密钥的回调。 | 5550 5551**错误码:** 5552以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5553 5554| 错误码ID | 错误信息 | 5555| -------- | ---------------------- | 5556| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5557| 17620001 | memory operation failed. | 5558| 17620002 | failed to convert parameters between arkts and c. | 5559| 17630001 | crypto operation error. | 5560 5561### generateSecret 5562 5563generateSecret(priKey: PriKey, pubKey: PubKey): Promise\<DataBlob> 5564 5565基于传入的私钥与公钥进行密钥协商,通过Promise返回共享密钥。 5566 5567**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5568 5569**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 5570 5571API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.KeyAgreement。 5572 5573**参数:** 5574 5575| 参数名 | 类型 | 必填 | 说明 | 5576| ------ | ------ | ---- | ---------------------- | 5577| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 5578| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 5579 5580**返回值:** 5581 5582| 类型 | 说明 | 5583| ------------------ | -------- | 5584| Promise\<[DataBlob](#datablob)> | 共享密钥。 | 5585 5586**错误码:** 5587以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5588 5589| 错误码ID | 错误信息 | 5590| -------- | ---------------------- | 5591| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5592| 17620001 | memory operation failed. | 5593| 17620002 | failed to convert parameters between arkts and c. | 5594| 17630001 | crypto operation error. | 5595 5596### generateSecretSync<sup>12+</sup> 5597 5598generateSecretSync(priKey: PriKey, pubKey: PubKey): DataBlob 5599 5600基于传入的私钥与公钥进行密钥协商,通过同步返回共享密钥。 5601 5602**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5603 5604**系统能力:** SystemCapability.Security.CryptoFramework.KeyAgreement 5605 5606**参数:** 5607 5608| 参数名 | 类型 | 必填 | 说明 | 5609| ------ | ------ | ---- | ---------------------- | 5610| priKey | [PriKey](#prikey) | 是 | 设置密钥协商的私钥输入。 | 5611| pubKey | [PubKey](#pubkey) | 是 | 设置密钥协商的公钥输入。 | 5612 5613**返回值:** 5614 5615| 类型 | 说明 | 5616| ------------------ | -------- | 5617|[DataBlob](#datablob) | 共享密钥。 | 5618 5619**错误码:** 5620以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 5621 5622| 错误码ID | 错误信息 | 5623| -------- | ---------------------- | 5624| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5625| 17620001 | memory operation failed. | 5626| 17620002 | failed to convert parameters between arkts and c. | 5627| 17630001 | crypto operation error. | 5628 5629**callback示例:** 5630 5631```ts 5632import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5633import { BusinessError } from '@kit.BasicServicesKit'; 5634 5635async function testGenerateSecret() { 5636 let eccGen = cryptoFramework.createAsyKeyGenerator('ECC256'); 5637 let globalKeyPair = await eccGen.generateKeyPair(); 5638 let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 5639 keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey, (err, secret) => { 5640 if (err) { 5641 console.error("keyAgreement error."); 5642 return; 5643 } 5644 console.info('keyAgreement output is ' + secret.data); 5645 }); 5646} 5647``` 5648 5649**Promise示例:** 5650 5651```ts 5652import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5653import { BusinessError } from '@kit.BasicServicesKit'; 5654 5655async function testGenerateSecret() { 5656 let eccGen = cryptoFramework.createAsyKeyGenerator('ECC256'); 5657 let globalKeyPair = await eccGen.generateKeyPair(); 5658 let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 5659 let keyAgreementPromise = keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey); 5660 keyAgreementPromise.then(secret => { 5661 console.info('keyAgreement output is ' + secret.data); 5662 }).catch((error: BusinessError) => { 5663 console.error("keyAgreement error."); 5664 }); 5665} 5666``` 5667 5668**Sync示例:** 5669 5670```ts 5671import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5672import { BusinessError } from '@kit.BasicServicesKit'; 5673 5674async function testGenerateSecretSync() { 5675 let eccGen = cryptoFramework.createAsyKeyGenerator('ECC256'); 5676 let globalKeyPair = await eccGen.generateKeyPair(); 5677 let keyAgreement = cryptoFramework.createKeyAgreement('ECC256'); 5678 let secret = keyAgreement.generateSecretSync(globalKeyPair.priKey, globalKeyPair.pubKey); 5679 console.info("[Sync]keyAgreement output is " + secret.data); 5680} 5681``` 5682 5683## cryptoFramework.createMd 5684 5685createMd(algName: string): Md 5686 5687生成Md实例,用于进行消息摘要的计算与操作。 5688 5689支持的规格详见[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest-overview.md#支持的算法与规格)。 5690 5691**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5692 5693**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5694 5695API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest。 5696 5697**参数:** 5698 5699| 参数名 | 类型 | 必填 | 说明 | 5700| ------- | ------ | ---- | ------------------------------------------------------------ | 5701| algName | string | 是 | 指定摘要算法,支持算法请参考[MD消息摘要算法规格](../../security/CryptoArchitectureKit/crypto-generate-message-digest-overview.md#支持的算法与规格)。 | 5702 5703**返回值**: 5704 5705| 类型 | 说明 | 5706| ---- | --------------------------------------- | 5707| Md | 返回由输入算法指定生成的[Md](#md)对象。 | 5708 5709**错误码:** 5710以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 5711 5712| 错误码ID | 错误信息 | 5713| -------- | ------------------ | 5714| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5715| 17620001 | memory operation failed. | 5716 5717**示例:** 5718 5719```ts 5720import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5721import { BusinessError } from '@kit.BasicServicesKit'; 5722 5723try { 5724 // Set algName based on the algorithm supported. 5725 let md = cryptoFramework.createMd('SHA256'); 5726} catch (error) { 5727 let e: BusinessError = error as BusinessError; 5728 console.error(`sync error, ${e.code}, ${e.message}`); 5729} 5730``` 5731 5732## Md 5733 5734Md类,调用Md方法可以进行MD(Message Digest)摘要计算。调用前,需要通过[createMd](#cryptoframeworkcreatemd)构造Md实例。 5735 5736### 属性 5737 5738**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5739 5740**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5741 5742API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest。 5743 5744| 名称 | 类型 | 只读 | 可选 | 说明 | 5745| ------- | ------ | ---- | ---- | ---------------------- | 5746| algName | string | 是 | 否 | 代表指定的摘要算法名。 | 5747 5748### update 5749 5750update(input: DataBlob, callback: AsyncCallback\<void>): void 5751 5752传入消息进行Md更新摘要状态,通过注册回调函数更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。 5753 5754> **说明:** 5755> 5756> Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 5757 5758**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5759 5760**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5761 5762API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest。 5763 5764**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。 5765 5766**参数:** 5767 5768| 参数名 | 类型 | 必填 | 说明 | 5769| -------- | --------------------- | ---- | ------------ | 5770| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5771| callback | AsyncCallback\<void> | 是 | 回调函数。当摘要更新成功,err为undefined,否则为错误对象。 | 5772 5773**错误码:** 5774以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5775 5776| 错误码ID | 错误信息 | 5777| -------- | ---------------------- | 5778| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5779| 17620001| memory operation failed. | 5780| 17630001 | crypto operation error. | 5781 5782### update 5783 5784update(input: DataBlob): Promise\<void> 5785 5786传入消息进行Md更新摘要状态,通过Promise更新。update和digest为两段式接口,需要成组使用。其中digest必选,update可选。 5787 5788> **说明:** 5789> 5790> Md算法多次调用update更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 5791 5792**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5793 5794**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5795 5796API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest。 5797 5798**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。 5799 5800**参数:** 5801 5802| 参数名 | 类型 | 必填 | 说明 | 5803| ------ | -------- | ---- | ------------ | 5804| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5805 5806**返回值:** 5807 5808| 类型 | 说明 | 5809| -------------- | ------------- | 5810| Promise\<void> | 无返回结果的Promise对象。 | 5811 5812**错误码:** 5813以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 5814 5815| 错误码ID | 错误信息 | 5816| -------- | ---------------------- | 5817| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 5818| 17620001| memory operation failed. | 5819| 17630001 | crypto operation error. | 5820 5821### updateSync<sup>12+</sup> 5822 5823updateSync(input: DataBlob): void 5824 5825传入消息进行Md更新摘要状态,通过同步方式更新。updateSync和digestSync为两段式接口,需要成组使用。其中digestSync必选,updateSync可选。 5826 5827> **说明:** 5828> 5829> Md算法多次调用updateSync更新的代码示例详见开发指导[消息摘要计算](../../security/CryptoArchitectureKit/crypto-generate-message-digest.md#分段摘要算法)。 5830 5831**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5832 5833**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5834 5835**参数:** 5836 5837| 参数名 | 类型 | 必填 | 说明 | 5838| ------ | -------- | ---- | ------------ | 5839| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 5840 5841**错误码:** 5842以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 5843 5844| 错误码ID | 错误信息 | 5845| -------- | ---------------------- | 5846| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 5847| 17620001| memory operation failed. | 5848| 17630001 | crypto operation error. | 5849 5850### digest 5851 5852digest(callback: AsyncCallback\<DataBlob>): void 5853 5854通过注册回调函数返回Md的计算结果。 5855 5856**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5857 5858**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5859 5860API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest。 5861 5862**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。 5863 5864**参数:** 5865 5866| 参数名 | 类型 | 必填 | 说明 | 5867| -------- | ------------------------ | ---- | ---------- | 5868| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 5869 5870**错误码:** 5871以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 5872 5873 5874| 错误码ID | 错误信息 | 5875| -------- | ---------------------- | 5876| 17620001 | memory operation failed. | 5877| 17630001 | crypto operation error. | 5878 5879**示例:** 5880 5881```ts 5882import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5883import { buffer } from '@kit.ArkTS'; 5884 5885function mdByCallback() { 5886 let md = cryptoFramework.createMd('SHA256'); 5887 md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }, (err) => { 5888 md.digest((err, digestOutput) => { 5889 console.info('[Callback]: MD result: ' + digestOutput.data); 5890 console.info('[Callback]: MD len: ' + md.getMdLength()); 5891 }); 5892 }); 5893} 5894``` 5895 5896### digest 5897 5898digest(): Promise\<DataBlob> 5899 5900通过Promise返回Md的计算结果。 5901 5902**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5903 5904**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5905 5906API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest。 5907 5908**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。 5909 5910**返回值:** 5911 5912| 类型 | 说明 | 5913| ------------------ | ----------- | 5914| Promise\<[DataBlob](#datablob)> | Promise对象。 | 5915 5916**错误码:** 5917以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 5918 5919| 错误码ID | 错误信息 | 5920| -------- | ---------------------- | 5921| 17620001 | memory operation failed. | 5922| 17630001 | crypto operation error. | 5923 5924**示例:** 5925 5926```ts 5927import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5928import { buffer } from '@kit.ArkTS'; 5929 5930async function mdByPromise() { 5931 let md = cryptoFramework.createMd('SHA256'); 5932 await md.update({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }); 5933 let mdOutput = await md.digest(); 5934 console.info('[Promise]: MD result: ' + mdOutput.data); 5935 console.info('[Promise]: MD len: ' + md.getMdLength()); 5936} 5937``` 5938 5939### digestSync<sup>12+</sup> 5940 5941digestSync(): DataBlob 5942 5943通过同步方式返回Md的计算结果。 5944 5945**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5946 5947**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5948 5949**返回值:** 5950 5951| 类型 | 说明 | 5952| ------------------ | ----------- | 5953| [DataBlob](#datablob) | 表示生成的Md计算结果。 | 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 operation failed. | 5962| 17620002 | failed to convert parameters between arkts and c. | 5963| 17630001 | crypto operation error. | 5964 5965**示例:** 5966 5967```ts 5968import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 5969import { buffer } from '@kit.ArkTS'; 5970 5971async function mdBySync() { 5972 let md = cryptoFramework.createMd('SHA256'); 5973 md.updateSync({ data: new Uint8Array(buffer.from("mdTestMessage", 'utf-8').buffer) }); 5974 let mdOutput = md.digestSync(); 5975 console.info('[Sync]: MD result: ' + mdOutput.data); 5976 console.info('[Sync]: MD len: ' + md.getMdLength()); 5977} 5978``` 5979 5980### getMdLength 5981 5982getMdLength(): number 5983 5984获取Md消息摘要的字节长度。 5985 5986**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 5987 5988**系统能力:** SystemCapability.Security.CryptoFramework.MessageDigest 5989 5990API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.MessageDigest。 5991 5992**返回值:** 5993 5994| 类型 | 说明 | 5995| ------ | -------------------------- | 5996| number | 返回md计算结果的字节长度。 | 5997 5998**错误码:** 5999以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。 6000 6001| 错误码ID | 错误信息 | 6002| -------- | ---------------------- | 6003| 17630001 | crypto operation error. | 6004 6005**示例:** 6006 6007```ts 6008import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6009 6010function getLength() { 6011 let md = cryptoFramework.createMd('SHA256'); 6012 console.info('[Promise]: MD len: ' + md.getMdLength()); 6013} 6014``` 6015 6016## cryptoFramework.createMac 6017 6018createMac(algName: string): Mac 6019 6020生成Mac实例,用于消息认证码的计算与操作。 6021 6022支持的规格详见[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac-overview.md)。 6023 6024**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6025 6026**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6027 6028API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac。 6029 6030**参数:** 6031 6032| 参数名 | 类型 | 必填 | 说明 | 6033| ------- | ------ | ---- | ------------------------------------------------------------ | 6034| algName | string | 是 | 指定摘要算法,支持算法请参考[HMAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac-overview.md)。 | 6035 6036**返回值**: 6037 6038| 类型 | 说明 | 6039| ---- | ----------------------------------------- | 6040| Mac | 返回由输入算法指定生成的[Mac](#mac)对象。 | 6041 6042**错误码:** 6043以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6044 6045| 错误码ID | 错误信息 | 6046| -------- | ------------------ | 6047| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6048| 17620001 | memory operation failed. | 6049 6050**示例:** 6051 6052```ts 6053import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6054import { BusinessError } from '@kit.BasicServicesKit'; 6055 6056try { 6057 // Set algName based on the algorithm supported. 6058 let mac = cryptoFramework.createMac('SHA256'); 6059} catch (error) { 6060 let e: BusinessError = error as BusinessError; 6061 console.error(`sync error, ${e.code}, ${e.message}`); 6062} 6063``` 6064 6065## cryptoFramework.createMac<sup>18+</sup> 6066 6067createMac(macSpec: MacSpec): Mac 6068 6069生成Mac实例,用于进行消息认证码的计算与操作。 6070 6071支持的规格详见[MAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac-overview.md)。 6072 6073**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。 6074 6075**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6076 6077**参数:** 6078 6079| 参数名 | 类型 | 必填 | 说明 | 6080| ------- | ------ | ---- | ------------------------------------------------------------ | 6081| macSpec | [MacSpec](#macspec18) | 是 | 根据消息验证码的不同算法,指定入参结构体,支持算法请参考[MAC消息认证码算法规格](../../security/CryptoArchitectureKit/crypto-compute-mac-overview.md)。 | 6082 6083**返回值**: 6084 6085| 类型 | 说明 | 6086| ---- | ----------------------------------------- | 6087| Mac | 返回由指定入参结构体生成的[Mac](#mac)对象。 | 6088 6089**错误码:** 6090以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6091 6092| 错误码ID | 错误信息 | 6093| -------- | ------------------ | 6094| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6095| 17620001 | memory operation failed. | 6096| 17620002 | failed to convert parameters between arkts and c. | 6097| 17630001 | crypto operation error. | 6098 6099**示例:** 6100 6101```ts 6102import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6103import { BusinessError } from '@kit.BasicServicesKit'; 6104 6105try { 6106 // Set algName based on the algorithm supported. 6107 let spec: cryptoFramework.HmacSpec = { 6108 algName: "HMAC", 6109 mdName: "SHA256", 6110 }; 6111 let mac = cryptoFramework.createMac(spec); 6112} catch (error) { 6113 let e: BusinessError = error as BusinessError; 6114 console.error(`sync error, ${e.code}, ${e.message}`); 6115} 6116``` 6117 6118## Mac 6119 6120Mac类,调用Mac方法可以进行MAC(Message Authentication Code)加密计算。调用前,需要通过[createMac](#cryptoframeworkcreatemac)构造Mac实例。 6121 6122### 属性 6123 6124**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6125 6126**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6127 6128API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac。 6129 6130| 名称 | 类型 | 只读 | 可选 | 说明 | 6131| ------- | ------ | ---- | ---- | ---------------------- | 6132| algName | string | 是 | 否 | 代表指定的摘要算法名。 | 6133 6134### init 6135 6136init(key: SymKey, callback: AsyncCallback\<void>): void 6137 6138使用对称密钥初始化Mac计算,通过注册回调函数获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 6139 6140 > **说明:** 6141 > 6142 > 建议通过[HMAC密钥生成规格](../../security/CryptoArchitectureKit/crypto-sym-key-generation-conversion-spec.md#hmac)创建对称密钥生成器,调用[generateSymKey](#generatesymkey)随机生成对称密钥或调用[convertKey](#convertkey)传入与密钥规格长度一致的二进制密钥数据生成密钥。<br/>当指定“HMAC”生成对称密钥生成器时,仅支持调用[convertKey](#convertkey)传入长度在[1,4096]范围内(单位为byte)的任意二进制密钥数据生成密钥。 6143 6144**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6145 6146**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6147 6148API version 9-11 系统能力为SystemCapability.Security.CryptoFramework;从API version 12 开始为SystemCapability.Security.CryptoFramework.Mac。 6149 6150**参数:** 6151 6152| 参数名 | 类型 | 必填 | 说明 | 6153| -------- | -------------------- | ---- | -------------- | 6154| key | [SymKey](#symkey) | 是 | 对称密钥。 | 6155| callback | AsyncCallback\<void> | 是 | 回调函数。当HMAC初始化成功,err为undefined,否则为错误对象。 | 6156 6157**错误码:** 6158以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6159 6160| 错误码ID | 错误信息 | 6161| -------- | ---------------------- | 6162| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6163| 17620001| memory operation failed. | 6164| 17630001 | crypto operation error. | 6165 6166### init 6167 6168init(key: SymKey): Promise\<void> 6169 6170使用对称密钥初始化Mac计算,通过Promise获取结果。init、update、doFinal为三段式接口,需要成组使用。其中init和doFinal必选,update可选。 6171 6172**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6173 6174**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6175 6176API version 9-11 系统能力为SystemCapability.Security.CryptoFramework;从API version 12 开始为SystemCapability.Security.CryptoFramework.Mac。 6177 6178**参数:** 6179 6180| 参数名 | 类型 | 必填 | 说明 | 6181| ------ | ------ | ---- | ------------ | 6182| key | [SymKey](#symkey) | 是 | 对称密钥。 | 6183 6184**返回值:** 6185 6186| 类型 | 说明 | 6187| -------------- | ------------- | 6188| Promise\<void> | 无返回结果的Promise对象。 | 6189 6190**错误码:** 6191以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6192 6193| 错误码ID | 错误信息 | 6194| -------- | ---------------------- | 6195| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6196| 17620001| memory operation failed. | 6197| 17630001 | crypto operation error. | 6198 6199### initSync<sup>12+</sup> 6200 6201initSync(key: SymKey): void 6202 6203使用对称密钥初始化Mac计算,通过同步方式获取结果。initSync、updateSync、doFinalSync为三段式接口,需要成组使用。其中initSync和doFinalSync必选,updateSync可选。 6204 6205**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6206 6207**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6208 6209**参数:** 6210 6211| 参数名 | 类型 | 必填 | 说明 | 6212| ------ | ------ | ---- | ------------ | 6213| key | [SymKey](#symkey) | 是 | 对称密钥。 | 6214 6215**错误码:** 6216以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 6217 6218| 错误码ID | 错误信息 | 6219| -------- | ---------------------- | 6220| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 6221| 17620001| memory operation failed. | 6222| 17630001 | crypto operation error. | 6223 6224### update 6225 6226update(input: DataBlob, callback: AsyncCallback\<void>): void 6227 6228传入消息进行Mac更新消息认证码状态,通过注册回调函数获取结果。 6229 6230> **说明:** 6231> 6232> HMAC算法多次调用update更新的代码示例详见[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。 6233 6234**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6235 6236**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6237 6238API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac。 6239 6240**参数:** 6241 6242| 参数名 | 类型 | 必填 | 说明 | 6243| -------- | --------------------- | ---- | ------------ | 6244| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 6245| callback | AsyncCallback\<void> | 是 | 回调函数。当HMAC更新成功,err为undefined,否则为错误对象。| 6246 6247**错误码:** 6248以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md)。 6249 6250| 错误码ID | 错误信息 | 6251| -------- | ---------------------- | 6252| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6253| 17620001| memory operation failed. | 6254| 17630001 | crypto operation error. | 6255 6256### update 6257 6258update(input: DataBlob): Promise\<void> 6259 6260传入消息进行Mac更新消息认证码状态,通过Promise获取结果。 6261 6262> **说明:** 6263> 6264> HMAC算法多次调用update更新的代码示例详见[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。 6265 6266**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6267 6268**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6269 6270API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac。 6271 6272**参数:** 6273 6274| 参数名 | 类型 | 必填 | 说明 | 6275| ------ | -------- | ---- | ---------- | 6276| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 6277 6278**返回值:** 6279 6280| 类型 | 说明 | 6281| -------------- | ------------- | 6282| Promise\<void> | 无返回结果的Promise对象。 | 6283 6284**错误码:** 6285以下错误码的详细介绍请参见[crypto framework 错误码](errorcode-crypto-framework.md)。 6286 6287| 错误码ID | 错误信息 | 6288| -------- | ---------------------- | 6289| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6290| 17620001| memory operation failed. | 6291| 17630001 | crypto operation error. | 6292 6293### updateSync<sup>12+</sup> 6294 6295updateSync(input: DataBlob): void 6296 6297传入消息进行Mac更新消息认证码状态,通过同步方式获取结果。 6298 6299> **说明:** 6300> 6301> HMAC算法多次调用updateSync更新的代码示例详见[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。 6302 6303**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6304 6305**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6306 6307**参数:** 6308 6309| 参数名 | 类型 | 必填 | 说明 | 6310| ------ | -------- | ---- | ---------- | 6311| input | [DataBlob](#datablob) | 是 | 传入的消息。 | 6312 6313 6314**错误码:** 6315以下错误码的详细介绍请参见[crypto framework 错误码](errorcode-crypto-framework.md)。 6316 6317| 错误码ID | 错误信息 | 6318| -------- | ---------------------- | 6319| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 6320| 17620001| memory operation failed. | 6321| 17630001 | crypto operation error. | 6322 6323### doFinal 6324 6325doFinal(callback: AsyncCallback\<DataBlob>): void 6326 6327通过注册回调函数返回Mac的计算结果。 6328 6329**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6330 6331**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6332 6333API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac。 6334 6335**参数:** 6336 6337| 参数名 | 类型 | 必填 | 说明 | 6338| -------- | ------------------------ | ---- | -------- | 6339| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 6340 6341**错误码:** 6342以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6343 6344| 错误码ID | 错误信息 | 6345| -------- | ---------------------- | 6346| 17620001 | memory operation failed. | 6347| 17630001 | crypto operation error. | 6348 6349**示例:** 6350 6351此外,更多HMAC的完整示例可参考开发指导中[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。 6352 6353```ts 6354import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6355import { buffer } from '@kit.ArkTS'; 6356 6357function hmacByCallback() { 6358 let mac = cryptoFramework.createMac('SHA256'); 6359 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 6360 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 6361 symKeyGenerator.convertKey(keyBlob, (err, symKey) => { 6362 mac.init(symKey, (err) => { 6363 mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }, (err) => { 6364 mac.doFinal((err, output) => { 6365 console.info('[Callback]: HMAC result: ' + output.data); 6366 console.info('[Callback]: MAC len: ' + mac.getMacLength()); 6367 }); 6368 }); 6369 }); 6370 }); 6371} 6372``` 6373 6374### doFinal 6375 6376doFinal(): Promise\<DataBlob> 6377 6378通过Promise返回Mac的计算结果。 6379 6380**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6381 6382**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6383 6384API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac。 6385 6386**返回值:** 6387 6388| 类型 | 说明 | 6389| ------------------ | ----------- | 6390| Promise\<[DataBlob](#datablob)> | Promise对象。 | 6391 6392**错误码:** 6393以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6394 6395| 错误码ID | 错误信息 | 6396| -------- | ---------------------- | 6397| 17620001 | memory operation failed. | 6398| 17630001 | crypto operation error. | 6399 6400**示例:** 6401 6402此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。 6403 6404```ts 6405import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6406import { buffer } from '@kit.ArkTS'; 6407 6408async function hmacByPromise() { 6409 let mac = cryptoFramework.createMac('SHA256'); 6410 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 6411 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 6412 let symKey = await symKeyGenerator.convertKey(keyBlob); 6413 await mac.init(symKey); 6414 await mac.update({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }); 6415 let macOutput = await mac.doFinal(); 6416 console.info('[Promise]: HMAC result: ' + macOutput.data); 6417 console.info('[Promise]: MAC len: ' + mac.getMacLength()); 6418} 6419``` 6420 6421### doFinalSync<sup>12+</sup> 6422 6423doFinalSync(): DataBlob 6424 6425通过同步方式返回Mac的计算结果。 6426 6427**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6428 6429**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6430 6431**返回值:** 6432 6433| 类型 | 说明 | 6434| ------------------ | ----------- | 6435| [DataBlob](#datablob) | 返回Mac的计算结果。 | 6436 6437**错误码:** 6438以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6439 6440| 错误码ID | 错误信息 | 6441| -------- | ---------------------- | 6442| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 6443| 17620001 | memory operation failed. | 6444| 17620002 | failed to convert parameters between arkts and c. | 6445| 17630001 | crypto operation error. | 6446 6447**示例:** 6448 6449此外,更多HMAC的完整示例可参考开发指导[消息认证码计算](../../security/CryptoArchitectureKit/crypto-compute-hmac.md#分段hmac)。 6450 6451```ts 6452import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6453import { buffer } from '@kit.ArkTS'; 6454 6455function hmacBySync() { 6456 let mac = cryptoFramework.createMac('SHA256'); 6457 let keyBlob: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from("12345678abcdefgh", 'utf-8').buffer) }; 6458 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 6459 let symKey = symKeyGenerator.convertKeySync(keyBlob); 6460 mac.initSync(symKey); 6461 mac.updateSync({ data: new Uint8Array(buffer.from("hmacTestMessage", 'utf-8').buffer) }); 6462 let macOutput = mac.doFinalSync(); 6463 console.info('[Sync]: HMAC result: ' + macOutput.data); 6464 console.info('[Sync]: MAC len: ' + mac.getMacLength()); 6465} 6466``` 6467 6468### getMacLength 6469 6470getMacLength(): number 6471 6472获取Mac消息认证码的长度(字节数)。 6473 6474**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6475 6476**系统能力:** SystemCapability.Security.CryptoFramework.Mac 6477 6478API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Mac。 6479 6480**返回值:** 6481 6482| 类型 | 说明 | 6483| ------ | --------------------------- | 6484| number | 返回Mac计算结果的字节长度。 | 6485 6486**错误码:** 6487以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6488 6489| 错误码ID | 错误信息 | 6490| -------- | ---------------------- | 6491| 17630001 | crypto operation error. | 6492 6493**示例:** 6494 6495```ts 6496import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6497import { BusinessError } from '@kit.BasicServicesKit'; 6498 6499function testGetMacLength() 6500{ 6501 let mac = cryptoFramework.createMac('SHA256'); 6502 console.info('Mac algName is: ' + mac.algName); 6503 let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]); 6504 let keyBlob: cryptoFramework.DataBlob = { data: keyData }; 6505 let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128'); 6506 let promiseConvertKey = symKeyGenerator.convertKey(keyBlob); 6507 promiseConvertKey.then(symKey => { 6508 let promiseMacInit = mac.init(symKey); 6509 return promiseMacInit; 6510 }).then(() => { 6511 let blob: cryptoFramework.DataBlob = { data : new Uint8Array([83])}; 6512 let promiseMacUpdate = mac.update(blob); 6513 return promiseMacUpdate; 6514 }).then(() => { 6515 let promiseMacDoFinal = mac.doFinal(); 6516 return promiseMacDoFinal; 6517 }).then(macOutput => { 6518 console.info('[Promise]: HMAC result: ' + macOutput.data); 6519 let macLen = mac.getMacLength(); 6520 console.info('MAC len: ' + macLen); 6521 }).catch((error: BusinessError) => { 6522 console.error("[Promise]: error: " + error.message); 6523 }); 6524} 6525``` 6526 6527## cryptoFramework.createRandom 6528 6529createRandom(): Random 6530 6531生成Random实例,用于进行随机数的计算与设置种子。 6532 6533支持的规格详见框架概述[随机数算法规格](../../security/CryptoArchitectureKit/crypto-generate-random-number.md#支持的算法与规格)。 6534 6535**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 6536 6537**系统能力:** SystemCapability.Security.CryptoFramework.Rand 6538 6539API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand。 6540 6541**返回值**: 6542 6543| 类型 | 说明 | 6544| ------ | ----------------------------------------------- | 6545| [Random](#random) | 返回由输入算法指定生成的[Random](#random)对象。 | 6546 6547**错误码:** 6548以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6549 6550| 错误码ID | 错误信息 | 6551| -------- | ------------ | 6552| 17620001 | memory operation failed. | 6553 6554**示例:** 6555 6556```ts 6557import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6558import { BusinessError } from '@kit.BasicServicesKit'; 6559 6560try { 6561 let rand = cryptoFramework.createRandom(); 6562} catch (error) { 6563 let e: BusinessError = error as BusinessError; 6564 console.error(`sync error, ${e.code}, ${e.message}`); 6565} 6566``` 6567 6568## Random 6569 6570Random类,调用Random方法可以进行随机数计算。调用前,需要通过[createRandom](#cryptoframeworkcreaterandom)构造Random实例。 6571 6572### 属性 6573 6574**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 6575 6576**系统能力:** SystemCapability.Security.CryptoFramework.Rand 6577 6578API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand。 6579 6580| 名称 | 类型 | 只读 | 可选 | 说明 | 6581| ------- | ------ | ---- | ---- | -------------------- | 6582| algName<sup>10+</sup> | string | 是 | 否 | 代表当前使用的随机数生成算法,目前只支持“CTR_DRBG"。 | 6583 6584### generateRandom 6585 6586generateRandom(len: number, callback: AsyncCallback\<DataBlob>): void 6587 6588异步生成指定长度的随机数,通过注册回调函数返回。 6589 6590**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 6591 6592**系统能力:** SystemCapability.Security.CryptoFramework.Rand 6593 6594API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand。 6595 6596**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。 6597 6598**参数:** 6599 6600| 参数名 | 类型 | 必填 | 说明 | 6601| -------- | ------------------------ | ---- | -------------------- | 6602| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 6603| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取DataBlob数据。 | 6604 6605**错误码:** 6606以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6607 6608| 错误码ID | 错误信息 | 6609| -------- | ---------------------- | 6610| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6611| 17620001 | memory operation failed. | 6612| 17630001 | crypto operation error. | 6613 6614**示例:** 6615 6616```ts 6617import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6618 6619let rand = cryptoFramework.createRandom(); 6620rand.generateRandom(12, (err, randData) => { 6621 if (err) { 6622 console.error("[Callback] err: " + err.code); 6623 } else { 6624 console.info('[Callback]: generate random result: ' + randData.data); 6625 } 6626}); 6627``` 6628 6629### generateRandom 6630 6631generateRandom(len: number): Promise\<DataBlob> 6632 6633异步生成指定长度的随机数,通过Promise返回。 6634 6635**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 6636 6637**系统能力:** SystemCapability.Security.CryptoFramework.Rand 6638 6639API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand。 6640 6641**设备行为差异:** 该接口仅在Phone、PC/2in1、Tablet、TV、Wearable设备中可正常调用,在Lite Wearable设备中返回undefined。 6642 6643**参数:** 6644 6645| 参数名 | 类型 | 必填 | 说明 | 6646| ------ | ------ | ---- | ------------------------------------------------------ | 6647| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 6648 6649**返回值:** 6650 6651| 类型 | 说明 | 6652| ------------------ | ----------- | 6653| Promise\<[DataBlob](#datablob)> | Promise对象。 | 6654 6655**错误码:** 6656以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6657 6658| 错误码ID | 错误信息 | 6659| -------- | ---------------------- | 6660| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6661| 17620001 | memory operation failed. | 6662| 17630001 | crypto operation error. | 6663 6664**示例:** 6665 6666```ts 6667import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6668import { BusinessError } from '@kit.BasicServicesKit'; 6669 6670let rand = cryptoFramework.createRandom(); 6671let promiseGenerateRand = rand.generateRandom(12); 6672promiseGenerateRand.then(randData => { 6673 console.info('[Promise]: rand result: ' + randData.data); 6674}).catch((error: BusinessError) => { 6675 console.error("[Promise]: error: " + error.message); 6676}); 6677``` 6678 6679### generateRandomSync<sup>10+</sup> 6680 6681generateRandomSync(len: number): DataBlob 6682 6683同步生成指定长度的随机数。 6684 6685**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 6686 6687**系统能力:** SystemCapability.Security.CryptoFramework.Rand 6688 6689API version 10-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand。 6690 6691**参数:** 6692 6693| 参数名 | 类型 | 必填 | 说明 | 6694| ------ | ------ | ---- | -------------------- | 6695| len | number | 是 | 表示生成随机数的长度,单位为byte,范围在[1, INT_MAX]。 | 6696 6697**返回值:** 6698 6699| 类型 | 说明 | 6700| ------------------ | ----------- | 6701|[DataBlob](#datablob) | 表示生成的随机数。 | 6702 6703**错误码:** 6704以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。 6705 6706| 错误码ID | 错误信息 | 6707| -------- | ---------------------- | 6708| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6709| 17620001 | memory operation failed. | 6710| 17630001 | crypto operation error. | 6711 6712**示例:** 6713 6714```ts 6715import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6716import { BusinessError } from '@kit.BasicServicesKit'; 6717 6718let rand = cryptoFramework.createRandom(); 6719try { 6720 let randData = rand.generateRandomSync(12); 6721 if (randData != null) { 6722 console.info('[Sync]: rand result: ' + randData.data); 6723 } else { 6724 console.error("[Sync]: get rand result fail!"); 6725 } 6726} catch (error) { 6727 let e: BusinessError = error as BusinessError; 6728 console.error(`sync error, ${e.code}, ${e.message}`); 6729} 6730``` 6731 6732### setSeed 6733 6734setSeed(seed: DataBlob): void 6735 6736设置指定的种子。 6737 6738**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 6739 6740**系统能力:** SystemCapability.Security.CryptoFramework.Rand 6741 6742API version 9-11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Rand。 6743 6744**参数:** 6745 6746| 参数名 | 类型 | 必填 | 说明 | 6747| ------ | -------- | ---- | ------------ | 6748| seed | [DataBlob](#datablob) | 是 | 设置的种子。 | 6749 6750**错误码:** 6751以下错误码的详细介绍请参见 [crypto framework 错误码](errorcode-crypto-framework.md)。 6752 6753| 错误码ID | 错误信息 | 6754| -------- | ----------------- | 6755| 17620001 | memory operation failed. | 6756 6757**示例:** 6758 6759```ts 6760import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6761import { BusinessError } from '@kit.BasicServicesKit'; 6762 6763let rand = cryptoFramework.createRandom(); 6764rand.generateRandom(12, (err, randData) => { 6765 if (err) { 6766 console.error("[Callback] err: " + err.code); 6767 } else { 6768 console.info('[Callback]: generate random result: ' + randData.data); 6769 try { 6770 rand.setSeed(randData); 6771 } catch (error) { 6772 let e: BusinessError = error as BusinessError; 6773 console.error(`sync error, ${e.code}, ${e.message}`); 6774 } 6775 } 6776}); 6777``` 6778 6779## cryptoFramework.createKdf<sup>11+</sup> 6780 6781createKdf(algName: string): Kdf 6782 6783密钥派生函数(key derivation function)实例生成。<br/>支持的规格详见[密钥派生函数规格](../../security/CryptoArchitectureKit/crypto-key-derivation-overview.md)。 6784 6785**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6786 6787**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6788 6789API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf。 6790 6791**参数:** 6792 6793| 参数名 | 类型 | 必填 | 说明 | 6794| ------- | ------ | ---- | --------------------------------- | 6795| algName | string | 是 | 指定密钥派生算法(包含HMAC配套的散列函数):目前支持PBKDF2、HKDF算法、SCRYPT算法,如"PBKDF2\|SHA256", "HKDF\|SHA256", "SCRYPT"。 | 6796 6797**返回值**: 6798 6799| 类型 | 说明 | 6800| ------------ | ------------------------------------------ | 6801| [Kdf](#kdf11) | 返回由输入算法指定生成的Kdf对象。 | 6802 6803**错误码:** 6804以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6805 6806| 错误码ID | 错误信息 | 6807| -------- | ---------------------- | 6808| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6809| 801 | this operation is not supported. | 6810| 17620001 | memory operation failed. | 6811 6812**示例:** 6813- PBKDF2算法 6814```ts 6815import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6816 6817let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6818``` 6819 6820## Kdf<sup>11+</sup> 6821 6822密钥派生函数(key derivation function)类,使用密钥派生方法之前需要创建该类的实例进行操作,通过createKdf(algName: string): Kdf方法构造此实例。 6823 6824### 属性 6825 6826**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6827 6828**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6829 6830API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf。 6831 6832| 名称 | 类型 | 只读 | 可选 | 说明 | 6833| ------- | ------ | ---- | ---- | ---------------------------- | 6834| algName | string | 是 | 否 | 密钥派生函数的算法名称。 | 6835 6836### generateSecret<sup>11+</sup> 6837 6838generateSecret(params: KdfSpec, callback: AsyncCallback\<DataBlob>): void 6839 6840基于传入的密钥派生参数进行密钥派生,通过注册回调函数返回派生得到的密钥。 6841 6842**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6843 6844**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6845 6846API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf。 6847 6848**参数:** 6849 6850| 参数名 | 类型 | 必填 | 说明 | 6851| -------- | ------------------------ | ---- | ---------------------- | 6852| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 6853| callback | AsyncCallback\<[DataBlob](#datablob)> | 是 | 回调函数,用于获取派生得到的密钥DataBlob数据。 | 6854 6855**错误码:** 6856以下错误码的详细介绍请参见[crypto framework错误码]。 6857 6858| 错误码ID | 错误信息 | 6859| -------- | ---------------------- | 6860| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6861| 17620001 | memory operation failed. | 6862| 17630001 | crypto operation error. | 6863 6864**示例:** 6865 6866- PBKDF2算法 6867 ```ts 6868 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6869 6870 let spec: cryptoFramework.PBKDF2Spec = { 6871 algName: 'PBKDF2', 6872 password: '123456', 6873 salt: new Uint8Array(16), 6874 iterations: 10000, 6875 keySize: 32 6876 }; 6877 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6878 kdf.generateSecret(spec, (err, secret) => { 6879 if (err) { 6880 console.error("key derivation error."); 6881 return; 6882 } 6883 console.info('key derivation output is ' + secret.data); 6884 }); 6885 ``` 6886 6887- HKDF算法 6888 ```ts 6889 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6890 6891 let spec: cryptoFramework.HKDFSpec = { 6892 algName: 'HKDF', 6893 key: '123456', 6894 salt: new Uint8Array(16), 6895 info: new Uint8Array(16), 6896 keySize: 32 6897 }; 6898 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 6899 kdf.generateSecret(spec, (err, secret) => { 6900 if (err) { 6901 console.error("key derivation error."); 6902 return; 6903 } 6904 console.info('key derivation output is ' + secret.data); 6905 }); 6906 ``` 6907 6908### generateSecret<sup>11+</sup> 6909 6910generateSecret(params: KdfSpec): Promise\<DataBlob> 6911 6912基于传入的密钥派生参数进行密钥派生,通过Promise形式返回派生得到的密钥。 6913 6914**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6915 6916**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6917 6918API version 11系统能力为SystemCapability.Security.CryptoFramework;从API version 12开始为SystemCapability.Security.CryptoFramework.Kdf。 6919 6920**参数:** 6921 6922| 参数名 | 类型 | 必填 | 说明 | 6923| ------ | ------ | ---- | ---------------------- | 6924| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 6925 6926**返回值:** 6927 6928| 类型 | 说明 | 6929| ------------------ | -------- | 6930| Promise\<[DataBlob](#datablob)> | 通过Promise形式返回派生得到的密钥。 | 6931 6932**错误码:** 6933以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 6934 6935| 错误码ID | 错误信息 | 6936| -------- | ---------------------- | 6937| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed.| 6938| 17620001 | memory operation failed. | 6939| 17630001 | crypto operation error. | 6940 6941**示例:** 6942 6943- PBKDF2算法 6944 ```ts 6945 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6946 import { BusinessError } from '@kit.BasicServicesKit'; 6947 6948 let spec: cryptoFramework.PBKDF2Spec = { 6949 algName: 'PBKDF2', 6950 password: '123456', 6951 salt: new Uint8Array(16), 6952 iterations: 10000, 6953 keySize: 32 6954 }; 6955 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 6956 let kdfPromise = kdf.generateSecret(spec); 6957 kdfPromise.then(secret => { 6958 console.info('key derivation output is ' + secret.data); 6959 }).catch((error: BusinessError) => { 6960 console.error("key derivation error, " + error.message); 6961 }); 6962 ``` 6963 6964- HKDF算法 6965 ```ts 6966 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 6967 import { BusinessError } from '@kit.BasicServicesKit'; 6968 6969 let spec: cryptoFramework.HKDFSpec = { 6970 algName: 'HKDF', 6971 key: '123456', 6972 salt: new Uint8Array(16), 6973 info: new Uint8Array(16), 6974 keySize: 32 6975 }; 6976 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 6977 let kdfPromise = kdf.generateSecret(spec); 6978 kdfPromise.then(secret => { 6979 console.info('key derivation output is ' + secret.data); 6980 }).catch((error: BusinessError) => { 6981 console.error("key derivation error, " + error.message); 6982 }); 6983 ``` 6984 6985### generateSecretSync<sup>12+</sup> 6986 6987generateSecretSync(params: KdfSpec): DataBlob 6988 6989基于传入的密钥派生参数进行密钥派生,通过同步方式返回派生得到的密钥。 6990 6991**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 6992 6993**系统能力:** SystemCapability.Security.CryptoFramework.Kdf 6994 6995**参数:** 6996 6997| 参数名 | 类型 | 必填 | 说明 | 6998| ------ | ------ | ---- | ---------------------- | 6999| params | [KdfSpec](#kdfspec11) | 是 | 设置密钥派生函数的参数。 | 7000 7001**返回值:** 7002 7003| 类型 | 说明 | 7004| ------------------ | -------- | 7005| [DataBlob](#datablob) | 用于获取派生得到的密钥DataBlob数据。 | 7006 7007**错误码:** 7008以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 7009 7010| 错误码ID | 错误信息 | 7011| -------- | ---------------------- | 7012| 401 | invalid parameters. Possible causes: <br>1. Mandatory parameters are left unspecified;<br>2. Incorrect parameter types;<br>3. Parameter verification failed. | 7013| 17620001 | memory operation failed. | 7014| 17620002 | failed to convert parameters between arkts and c. | 7015| 17630001 | crypto operation error. | 7016 7017**示例:** 7018 7019- PBKDF2算法 7020 ```ts 7021 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 7022 7023 let spec: cryptoFramework.PBKDF2Spec = { 7024 algName: 'PBKDF2', 7025 password: '123456', 7026 salt: new Uint8Array(16), 7027 iterations: 10000, 7028 keySize: 32 7029 }; 7030 let kdf = cryptoFramework.createKdf('PBKDF2|SHA256'); 7031 let secret = kdf.generateSecretSync(spec); 7032 console.info("[Sync]key derivation output is " + secret.data); 7033 ``` 7034 7035- HKDF算法 7036 ```ts 7037 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 7038 7039 let spec: cryptoFramework.HKDFSpec = { 7040 algName: 'HKDF', 7041 key: '123456', 7042 salt: new Uint8Array(16), 7043 info: new Uint8Array(16), 7044 keySize: 32 7045 }; 7046 let kdf = cryptoFramework.createKdf('HKDF|SHA256|EXTRACT_AND_EXPAND'); 7047 let secret = kdf.generateSecretSync(spec); 7048 console.info("[Sync]key derivation output is " + secret.data); 7049 ``` 7050 7051## SignatureUtils<sup>20+</sup> 7052 7053用于SM2数据转换的工具类。 7054 7055### genEccSignatureSpec<sup>20+</sup> 7056 7057static genEccSignatureSpec(data: Uint8Array): EccSignatureSpec 7058 7059从ASN1 DER格式的sm2签名数据获取r和s。 7060 7061**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。 7062 7063**系统能力:** SystemCapability.Security.CryptoFramework.Signature 7064 7065**参数:** 7066 7067| 参数名 | 类型 | 必填 | 说明 | 7068| ------ | ------ | ---- | ---------------------- | 7069| data | Uint8Array | 是 | ASN1 DER格式的签名数据。 | 7070 7071**返回值:** 7072 7073| 类型 | 说明 | 7074| ------------------ | -------- | 7075| [EccSignatureSpec](#eccsignaturespec20) | 包含r和s的数据结构体。 | 7076 7077**错误码:** 7078以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 7079 7080| 错误码ID | 错误信息 | 7081| -------- | ---------------------- | 7082| 17620001 | memory operation failed. | 7083| 17620002 | failed to convert parameters between arkts and c. | 7084| 17620003 | parameter check failed. Possible causes: <br>1. The length of the data parameter is 0 or too large. | 7085| 17630001 | crypto operation error. | 7086 7087**示例:** 7088 7089 ```ts 7090 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 7091 import { BusinessError } from '@kit.BasicServicesKit'; 7092 7093 function testGenEccSignatureSpec() { 7094 try { 7095 let data = 7096 new Uint8Array([48, 69, 2, 33, 0, 216, 15, 76, 238, 158, 165, 108, 76, 72, 63, 115, 52, 255, 51, 149, 54, 224, 7097 179, 49, 225, 70, 36, 117, 88, 154, 154, 27, 194, 161, 3, 1, 115, 2, 32, 51, 9, 53, 55, 248, 82, 7, 159, 179, 7098 144, 57, 151, 195, 17, 31, 106, 123, 32, 139, 219, 6, 253, 62, 240, 181, 134, 214, 107, 27, 230, 175, 40]) 7099 let spec: cryptoFramework.EccSignatureSpec = cryptoFramework.SignatureUtils.genEccSignatureSpec(data) 7100 console.info('genEccSignatureSpec success'); 7101 } catch (err) { 7102 let e: BusinessError = err as BusinessError; 7103 console.error(`ecc error, ${e.code}, ${e.message}`); 7104 } 7105 } 7106 ``` 7107 7108 7109### genEccSignature<sup>20+</sup> 7110 7111static genEccSignature(spec: EccSignatureSpec): Uint8Array; 7112 7113将(r、s)的sm2签名数据转换为ASN1 DER格式。 7114 7115**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。 7116 7117**系统能力:** SystemCapability.Security.CryptoFramework.Signature 7118 7119**参数:** 7120 7121| 参数名 | 类型 | 必填 | 说明 | 7122| ------ | ------ | ---- | ---------------------- | 7123| spec | [EccSignatureSpec](#eccsignaturespec20) | 是 | (r、s)的sm2签名数据。 | 7124 7125**返回值:** 7126 7127| 类型 | 说明 | 7128| ------------------ | -------- | 7129| Uint8Array | ASN1 DER格式的签名数据。 | 7130 7131**错误码:** 7132以下错误码的详细介绍请参见[crypto framework错误码](errorcode-crypto-framework.md) 7133 7134| 错误码ID | 错误信息 | 7135| -------- | ---------------------- | 7136| 17620001 | memory operation failed. | 7137| 17620002 | failed to convert parameters between arkts and c. | 7138| 17620003 | parameter check failed. Possible causes: <br>1. The r or s value of the spec parameter is 0 or too large. | 7139| 17630001 | crypto operation error. | 7140 7141**示例:** 7142 7143 ```ts 7144 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 7145 import { BusinessError } from '@kit.BasicServicesKit'; 7146 7147 function testGenEccSignature() { 7148 try { 7149 let spec: cryptoFramework.EccSignatureSpec = { 7150 r: BigInt('97726608965854271693043443511967021777934035174185659091642456228829830775155'), 7151 s: BigInt('23084224202834231287427338597254751764391338275617140205467537273296855150376'), 7152 } 7153 7154 let data = cryptoFramework.SignatureUtils.genEccSignature(spec) 7155 console.info('genEccSignature success'); 7156 console.info('data is ' + data) 7157 } catch (err) { 7158 let e: BusinessError = err as BusinessError; 7159 console.error(`ecc error, ${e.code}, ${e.message}`); 7160 } 7161 } 7162 ```