• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.security.cryptoFramework (加解密算法库框架)
2
3为屏蔽底层硬件和算法库,向上提供统一的密码算法库加解密相关接口。
4
5> **说明:**
6>
7> 本模块首批接口从API version 9开始支持。
8
9## 导入模块
10
11```javascript
12import cryptoFramework from "@ohos.security.cryptoFramework"
13```
14
15## Result
16
17 表示执行结果的枚举。
18
19 **系统能力:** SystemCapability.Security.CryptoFramework
20
21| 名称                                  |    值   |   说明                         |
22| ------------------------------------- | -------- | ---------------------------- |
23| INVALID_PARAMS                        | 401      | 非法入参。                   |
24| NOT_SUPPORT                           | 801      | 操作不支持。                 |
25| ERR_OUT_OF_MEMORY                     | 17620001 | 内存错误。                   |
26| ERR_RUNTIME_ERROR                     | 17620002 | 运行时外部错误。             |
27| ERR_CRYPTO_OPERATION                  | 17630001 | 调用三方算法库API出错。      |
28
29## DataBlob
30
31buffer数组。
32
33 **系统能力:** SystemCapability.Security.CryptoFramework
34
35| 名称 | 类型       | 可读 | 可写 | 说明   |
36| ---- | ---------- | ---- | ---- | ------ |
37| data | Uint8Array | 是   | 是   | 数据。 |
38
39
40## cryptoFramework.createMac
41
42createMac(algName : string) : Mac
43
44生成Mac实例,用于进行消息认证码的计算与操作。<br/>支持的规格详见框架概述“[HMAC消息认证码算法规格](../../security/cryptoFramework-overview.md#hmac消息认证码算法规格)”一节。
45
46**系统能力:** SystemCapability.Security.CryptoFramework
47
48**参数:**
49
50| 参数名  | 类型   | 必填 | 说明                                                         |
51| ------- | ------ | ---- | ------------------------------------------------------------ |
52| algName | string | 是   | 指定摘要算法,支持算法请参考“[HMAC算法支持范围](../../security/cryptoFramework-overview.md#hmac消息认证码算法规格)”一节 |
53
54**返回值**:
55
56| 类型 | 说明                                    |
57| ---- | --------------------------------------- |
58| Mac  | 返回由输入算法指定生成的[Mac](#mac)对象 |
59
60**错误码:**
61
62| 错误码ID | 错误信息           |
63| -------- | ------------------ |
64| 17620001 | memory error.       |
65
66**示例:**
67
68```javascript
69import cryptoFramework from "@ohos.security.cryptoFramework"
70
71var mac;
72try {
73    // 参数选择请参考上述算法支持范围
74    mac = cryptoFramework.createMac("SHA256");
75} catch (error) {
76    console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
77}
78```
79
80## Mac
81
82Mac类,调用Mac方法可以进行MAC(Message Authentication Code)加密计算。调用前,需要通过[createMac](#cryptoframeworkcreatemac)构造Mac实例。
83
84### 属性
85
86**系统能力:** SystemCapability.Security.CryptoFramework
87
88| 名称    | 类型   | 可读 | 可写 | 说明                 |
89| ------- | ------ | ---- | ---- | -------------------- |
90| algName | string | 是   | 否   | 代表指定的摘要算法名 |
91
92### init
93
94init(key : SymKey, callback : AsyncCallback\<void>) : void;
95
96使用对称密钥初始化Mac计算
97
98**系统能力:** SystemCapability.Security.CryptoFramework
99
100**参数:**
101
102| 参数名   | 类型                 | 必填 | 说明         |
103| -------- | -------------------- | ---- | ------------ |
104| key      | [SymKey](#symkey)    | 是   | 共享对称密钥 |
105| callback | AsyncCallback\<void> | 是   | 回调函数     |
106
107**错误码:**
108
109| 错误码ID | 错误信息               |
110| -------- | ---------------------- |
111| 17630001 | crypto operation error. |
112
113**示例:**
114
115```javascript
116import cryptoFramework from "@ohos.security.cryptoFramework"
117
118var mac;
119try {
120    mac = cryptoFramework.createMac("SHA256");
121} catch (error) {
122    console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
123}
124var KeyBlob;
125var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
126symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
127    if (err) {
128        console.error("[Callback] err: " + err.code);
129    }
130    mac.init(symKey, (err1, ) => {
131        if (err1) {
132            console.error("[Callback] err: " + err1.code);
133        }
134    });
135});
136```
137
138### init
139
140init(key : SymKey) : Promise\<void>;
141
142使用对称密钥初始化Mac计算
143
144**系统能力:** SystemCapability.Security.CryptoFramework
145
146**参数:**
147
148| 参数名 | 类型   | 必填 | 说明         |
149| ------ | ------ | ---- | ------------ |
150| key    | [SymKey](#symkey) | 是   | 共享对称密钥 |
151
152**返回值:**
153
154| 类型           | 说明        |
155| -------------- | ----------- |
156| Promise\<void> | Promise对象 |
157
158**错误码:**
159
160| 错误码ID | 错误信息               |
161| -------- | ---------------------- |
162| 17630001 | crypto operation error. |
163
164**示例:**
165
166```javascript
167import cryptoFramework from "@ohos.security.cryptoFramework"
168
169var mac;
170try {
171    mac = cryptoFramework.createMac("SHA256");
172} catch (error) {
173    console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
174}
175console.error("Mac algName is: " + mac.algName);
176
177var KeyBlob;
178var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
179var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
180promiseConvertKey.then(symKey => {
181    var promiseMacInit = mac.init(symKey);
182    return promiseMacInit;
183}).catch(error => {
184    console.error("[Promise]: error: " + error.message);
185});
186
187```
188
189### update
190
191update(input : DataBlob, callback : AsyncCallback\<void>) : void;
192
193传入消息进行Mac更新计算
194
195> **说明:**
196> Hmac算法多次调用update更新的代码示例详见开发指导“[使用消息认证码操作](../../security/cryptoFramework-guidelines.md#使用消息认证码操作)”。
197
198**系统能力:** SystemCapability.Security.CryptoFramework
199
200**参数:**
201
202| 参数名   | 类型                 | 必填 | 说明       |
203| -------- | -------------------- | ---- | ---------- |
204| input    | [DataBlob](#datablob)| 是   | 传入的消息 |
205| callback | AsyncCallback\<void> | 是   | 回调函数   |
206
207**错误码:**
208
209| 错误码ID | 错误信息               |
210| -------- | ---------------------- |
211| 17630001 | crypto operation error. |
212
213**示例:**
214
215```javascript
216import cryptoFramework from "@ohos.security.cryptoFramework"
217
218var KeyBlob;
219var mac;
220try {
221    mac = cryptoFramework.createMac("SHA256");
222} catch (error) {
223    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
224}
225var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
226symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
227    if (err) {
228        console.error("[Callback] err: " + err.code);
229    }
230    mac.init(symKey, (err1, ) => {
231        if (err1) {
232            console.error("[Callback] err: " + err1.code);
233        }
234        let blob;
235      	mac.update(blob, (err2, data) => {
236        	if (err2) {
237            console.error("[Callback] err: " + err2.code);
238        	}
239      	});
240    });
241});
242```
243
244### update
245
246update(input : DataBlob) : Promise\<void>;
247
248传入消息进行Mac更新计算
249
250> **说明:**
251> Hmac算法多次调用update更新的代码示例详见开发指导“[使用消息认证码操作](../../security/cryptoFramework-guidelines.md#使用消息认证码操作)”。
252
253**系统能力:** SystemCapability.Security.CryptoFramework
254
255**参数:**
256
257| 参数名 | 类型     | 必填 | 说明       |
258| ------ | -------- | ---- | ---------- |
259| input  | [DataBlob](#datablob) | 是   | 传入的消息 |
260
261**返回值:**
262
263| 类型           | 说明        |
264| -------------- | ----------- |
265| Promise\<void> | Promise对象 |
266
267**错误码:**
268
269| 错误码ID | 错误信息               |
270| -------- | ---------------------- |
271| 17630001 | crypto operation error. |
272
273**示例:**
274
275```javascript
276import cryptoFramework from "@ohos.security.cryptoFramework"
277
278var mac;
279try {
280    mac = cryptoFramework.createMac("SHA256");
281} catch (error) {
282    console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
283}
284console.error("Mac algName is: " + mac.algName);
285
286var KeyBlob;
287var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
288var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
289promiseConvertKey.then(symKey => {
290    var promiseMacInit = mac.init(symKey);
291    return promiseMacInit;
292}).then(() => {
293    let blob;
294    var promiseMacUpdate = mac.update(blob);
295    return promiseMacUpdate;
296}).catch(error => {
297    console.error("[Promise]: error: " + error.message);
298});
299
300```
301
302### doFinal
303
304doFinal(callback : AsyncCallback\<DataBlob>) : void;
305
306返回Mac的计算结果
307
308**系统能力:** SystemCapability.Security.CryptoFramework
309
310**参数:**
311
312| 参数名   | 类型                     | 必填 | 说明     |
313| -------- | ------------------------ | ---- | -------- |
314| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数 |
315
316**错误码:**
317
318| 错误码ID | 错误信息               |
319| -------- | ---------------------- |
320| 17620001 | memory error.           |
321| 17630001 | crypto operation error. |
322
323**示例:**
324
325```javascript
326import cryptoFramework from "@ohos.security.cryptoFramework"
327
328var KeyBlob;
329var mac;
330try {
331    mac = cryptoFramework.createMac("SHA256");
332} catch (error) {
333    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
334}
335var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
336symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
337    if (err) {
338        console.error("[Callback] err: " + err.code);
339    }
340    mac.init(symKey, (err1, ) => {
341        if (err1) {
342            console.error("[Callback] err: " + err1.code);
343        }
344        let blob;
345        mac.update(blob, (err2, ) => {
346            if (err2) {
347                console.error("[Callback] err: " + err2.code);
348            }
349            mac.doFinal((err3, macOutput) => {
350                if (err3) {
351                    console.error("[Callback] err: " + err3.code);
352                } else {
353                    console.error("[Promise]: HMAC result: " + macOutput);
354                }
355            });
356        });
357    });
358});
359```
360
361### doFinal
362
363doFinal() : Promise\<DataBlob>
364
365返回Mac的计算结果
366
367**系统能力:** SystemCapability.Security.CryptoFramework
368
369**返回值:**
370
371| 类型               | 说明        |
372| ------------------ | ----------- |
373| Promise\<[DataBlob](#datablob)> | Promise对象 |
374
375**错误码:**
376
377| 错误码ID | 错误信息               |
378| -------- | ---------------------- |
379| 17620001 | memory error.           |
380| 17630001 | crypto operation error. |
381
382**示例:**
383
384```javascript
385import cryptoFramework from "@ohos.security.cryptoFramework"
386
387var mac;
388try {
389    mac = cryptoFramework.createMac("SHA256");
390} catch (error) {
391    console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
392}
393console.error("Mac algName is: " + mac.algName);
394
395var KeyBlob;
396var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
397var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
398promiseConvertKey.then(symKey => {
399    var promiseMacInit = mac.init(symKey);
400    return promiseMacInit;
401}).then(() => {
402    let blob;
403    var promiseMacUpdate = mac.update(blob);
404    return promiseMacUpdate;
405}).then(() => {
406    var PromiseMacDoFinal = mac.doFinal();
407    return PromiseMacDoFinal;
408}).then(macOutput => {
409    console.error("[Promise]: HMAC result: " + macOutput.data);
410}).catch(error => {
411    console.error("[Promise]: error: " + error.message);
412});
413```
414
415### getMacLength
416
417getMacLength() : number
418
419获取Mac消息认证码的长度(字节数)
420
421**系统能力:** SystemCapability.Security.CryptoFramework
422
423**返回值:**
424
425| 类型   | 说明                      |
426| ------ | ------------------------- |
427| number | 返回mac计算结果的字节长度 |
428
429**错误码:**
430
431| 错误码ID | 错误信息               |
432| -------- | ---------------------- |
433| 17630001 | crypto operation error. |
434
435**示例:**
436
437```javascript
438import cryptoFramework from "@ohos.security.cryptoFramework"
439
440var mac;
441try {
442    mac = cryptoFramework.createMac("SHA256");
443} catch (error) {
444    console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
445}
446console.error("Mac algName is: " + mac.algName);
447
448var KeyBlob;
449var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
450var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
451promiseConvertKey.then(symKey => {
452    var promiseMacInit = mac.init(symKey);
453    return promiseMacInit;
454}).then(() => {
455    let blob;
456    var promiseMacUpdate = mac.update(blob);
457    return promiseMacUpdate;
458}).then(() => {
459    var PromiseMacDoFinal = mac.doFinal();
460    return PromiseMacDoFinal;
461}).then(macOutput => {
462    console.error("[Promise]: HMAC result: " + macOutput.data);
463    let macLen = mac.getMacLength();
464	console.error("MAC len: " + macLen);
465}).catch(error => {
466    console.error("[Promise]: error: " + error.message);
467});
468```
469
470## cryptoFramework.createMd
471
472createMd(algName : string) : Md
473
474生成Md实例,用于进行消息摘要的计算与操作。<br/>支持的规格详见框架概述“[MD消息摘要算法规格](../../security/cryptoFramework-overview.md#md消息摘要算法规格)”一节。
475
476**系统能力:** SystemCapability.Security.CryptoFramework
477
478**参数:**
479
480| 参数名  | 类型   | 必填 | 说明                                                         |
481| ------- | ------ | ---- | ------------------------------------------------------------ |
482| algName | string | 是   | 指定摘要算法,支持算法请参考“[MD算法支持范围](../../security/cryptoFramework-overview.md#md消息摘要算法规格)”一节 |
483
484**返回值**:
485
486| 类型 | 说明                                  |
487| ---- | ------------------------------------- |
488| Md   | 返回由输入算法指定生成的[Md](#md)对象 |
489
490**错误码:**
491
492| 错误码ID | 错误信息           |
493| -------- | ------------------ |
494| 17620001 | memory error.       |
495
496**示例:**
497
498```javascript
499import cryptoFramework from "@ohos.security.cryptoFramework"
500
501var md;
502try {
503    // 参数选择请参考上述算法支持范围
504    md = cryptoFramework.createMd("SHA256");
505} catch (error) {
506    console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
507}
508```
509
510## Md
511
512Md类,调用Md方法可以进行MD(Message Digest)摘要计算。调用前,需要通过[createMd](#cryptoframeworkcreatemd)构造Md实例。
513
514### 属性
515
516**系统能力:** SystemCapability.Security.CryptoFramework
517
518| 名称    | 类型   | 可读 | 可写 | 说明                 |
519| ------- | ------ | ---- | ---- | -------------------- |
520| algName | string | 是   | 否   | 代表指定的摘要算法名 |
521
522### update
523
524update(input : DataBlob, callback : AsyncCallback\<void>) : void;
525
526传入消息进行Md更新计算
527
528> **说明:**
529> Md算法多次调用update更新的代码示例详见开发指导“[使用摘要操作](../../security/cryptoFramework-guidelines.md#使用摘要操作)”。
530
531**系统能力:** SystemCapability.Security.CryptoFramework
532
533**参数:**
534
535| 参数名   | 类型                 | 必填 | 说明       |
536| -------- | -------------------- | ---- | ---------- |
537| input    | [DataBlob](#datablob)| 是   | 传入的消息 |
538| callback | AsyncCallback\<void> | 是   | 回调函数   |
539
540**错误码:**
541
542| 错误码ID | 错误信息               |
543| -------- | ---------------------- |
544| 17630001 | crypto operation error. |
545
546**示例:**
547
548```javascript
549import cryptoFramework from "@ohos.security.cryptoFramework"
550
551var md;
552try {
553    md = cryptoFramework.createMd("SHA256");
554} catch (error) {
555    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
556}
557console.error("Md algName is: " + md.algName);
558
559let blob;
560md.update(blob, (err,) => {
561    if (err) {
562        console.error("[Callback] err: " + err.code);
563    }
564});
565```
566
567### update
568
569update(input : DataBlob) : Promise\<void>;
570
571传入消息进行Md更新计算
572
573> **说明:**
574> Md算法多次调用update更新的代码示例详见开发指导“[使用摘要操作](../../security/cryptoFramework-guidelines.md#使用摘要操作)”。
575
576**系统能力:** SystemCapability.Security.CryptoFramework
577
578| 参数名 | 类型     | 必填 | 说明       |
579| ------ | -------- | ---- | ---------- |
580| input  | DataBlob | 是   | 传入的消息 |
581
582**返回值:**
583
584| 类型           | 说明        |
585| -------------- | ----------- |
586| Promise\<void> | Promise对象 |
587
588**错误码:**
589
590| 错误码ID | 错误信息               |
591| -------- | ---------------------- |
592| 17630001 | crypto operation error. |
593
594**示例:**
595
596```javascript
597import cryptoFramework from "@ohos.security.cryptoFramework"
598
599var md;
600try {
601    md = cryptoFramework.createMd("SHA256");
602} catch (error) {
603    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
604}
605console.error("Md algName is: " + md.algName);
606
607let blob;
608var promiseMdUpdate = md.update(blob);
609promiseMdUpdate.then(() => {
610    // do something
611}).catch(error => {
612    console.error("[Promise]: error: " + error.message);
613});
614```
615
616### digest
617
618digest(callback : AsyncCallback\<DataBlob>) : void
619
620返回Md的计算结果
621
622**系统能力:** SystemCapability.Security.CryptoFramework
623
624| 参数名   | 类型                     | 必填 | 说明     |
625| -------- | ------------------------ | ---- | -------- |
626| callback | AsyncCallback\<DataBlob> | 是   | 回调函数 |
627
628**错误码:**
629
630| 错误码ID | 错误信息               |
631| -------- | ---------------------- |
632| 17620001 | memory error.           |
633| 17630001 | crypto operation error. |
634
635**示例:**
636
637```javascript
638import cryptoFramework from "@ohos.security.cryptoFramework"
639
640var md;
641try {
642    md = cryptoFramework.createMd("SHA256");
643} catch (error) {
644    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
645}
646console.error("Md algName is: " + md.algName);
647
648let blob;
649md.update(blob, (err,) => {
650    if (err) {
651        console.error("[Callback] err: " + err.code);
652    }
653    md.digest((err1, mdOutput) => {
654		if (err1) {
655            console.error("[Callback] err: " + err1.code);
656        } else {
657            console.error("[Callback]: MD result: " + mdOutput);
658        }
659    });
660});
661```
662
663### digest
664
665digest() : Promise\<DataBlob>
666
667返回Md的计算结果
668
669**系统能力:** SystemCapability.Security.CryptoFramework
670
671**返回值:**
672
673| 类型               | 说明        |
674| ------------------ | ----------- |
675| Promise\<[DataBlob](#datablob)> | Promise对象 |
676
677**错误码:**
678
679| 错误码ID | 错误信息               |
680| -------- | ---------------------- |
681| 17620001 | memory error.           |
682| 17630001 | crypto operation error. |
683
684**示例:**
685
686```javascript
687import cryptoFramework from "@ohos.security.cryptoFramework"
688
689var md;
690try {
691    md = cryptoFramework.createMd("SHA256");
692} catch (error) {
693    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
694}
695console.error("Md algName is: " + md.algName);
696
697let blob;
698var promiseMdUpdate = md.update(blob);
699promiseMdUpdate.then(() => {
700    var PromiseMdDigest = md.digest();
701    return PromiseMdDigest;
702}).then(mdOutput => {
703    console.error("[Promise]: MD result: " + mdOutput.data);
704}).catch(error => {
705    console.error("[Promise]: error: " + error.message);
706});
707```
708
709### getMdLength
710
711getMdLength() : number
712
713获取Md消息摘要长度(字节数)
714
715**系统能力:** SystemCapability.Security.CryptoFramework
716
717**返回值:**
718
719| 类型   | 说明                     |
720| ------ | ------------------------ |
721| number | 返回md计算结果的字节长度 |
722
723**错误码:**
724
725| 错误码ID | 错误信息               |
726| -------- | ---------------------- |
727| 17630001 | crypto operation error. |
728
729**示例:**
730
731```javascript
732import cryptoFramework from "@ohos.security.cryptoFramework"
733
734var md;
735try {
736    md = cryptoFramework.createMd("SHA256");
737} catch (error) {
738    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
739}
740console.error("Md algName is: " + md.algName);
741
742let blob;
743var promiseMdUpdate = md.update(blob);
744promiseMdUpdate.then(() => {
745    var PromiseMdDigest = md.digest();
746    return PromiseMdDigest;
747}).then(mdOutput => {
748    console.error("[Promise]: MD result: " + mdOutput.data);
749    let mdLen = md.getMdLength();
750	console.error("MD len: " + mdLen);
751}).catch(error => {
752    console.error("[Promise]: error: " + error.message);
753});
754```
755
756## cryptoFramework.createRandom
757
758createRandom() : Random
759
760生成Random实例,用于进行随机数的计算与设置种子。
761
762**系统能力:** SystemCapability.Security.CryptoFramework
763
764**返回值**:
765
766| 类型   | 说明                                          |
767| ------ | --------------------------------------------- |
768| Random | 返回由输入算法指定生成的[Random](#random)对象 |
769
770**错误码:**
771
772| 错误码ID | 错误信息     |
773| -------- | ------------ |
774| 17620001 | memory error. |
775
776**示例:**
777
778```javascript
779import cryptoFramework from "@ohos.security.cryptoFramework"
780
781try {
782    var rand = cryptoFramework.createRandom();
783} catch (error) {
784    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
785}
786```
787
788## Random
789
790Random类,调用Random方法可以进行随机数计算。调用前,需要通过[createRandom](#cryptoframeworkcreaterandom)构造Random实例。
791
792### generateRandom
793
794generateRandom(len : number, callback: AsyncCallback\<DataBlob>) : void;
795
796生成指定长度的随机数
797
798**系统能力:** SystemCapability.Security.CryptoFramework
799
800**参数:**
801
802| 参数名   | 类型                     | 必填 | 说明                 |
803| -------- | ------------------------ | ---- | -------------------- |
804| len      | number                   | 是   | 表示生成随机数的长度 |
805| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数             |
806
807**错误码:**
808
809| 错误码ID | 错误信息               |
810| -------- | ---------------------- |
811| 17620001 | memory error.          |
812| 17630001 | crypto operation error. |
813
814**示例:**
815
816```javascript
817import cryptoFramework from "@ohos.security.cryptoFramework"
818
819var rand;
820try {
821    rand = cryptoFramework.createRandom();
822} catch (error) {
823    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
824}
825rand.generateRandom(12, (err, randData) => {
826    if (err) {
827        console.error("[Callback] err: " + err.code);
828    } else {
829        console.error("[Callback]: generate random result: " + randData.data);
830    }
831});
832```
833
834### generateRandom
835
836generateRandom(len : number) : Promise\<DataBlob>;
837
838生成指定长度的随机数
839
840**系统能力:** SystemCapability.Security.CryptoFramework
841
842**参数:**
843
844| 参数名 | 类型   | 必填 | 说明                 |
845| ------ | ------ | ---- | -------------------- |
846| len    | number | 是   | 表示生成随机数的长度 |
847
848**返回值:**
849
850| 类型               | 说明        |
851| ------------------ | ----------- |
852| Promise\<[DataBlob](#datablob)> | Promise对象 |
853
854**错误码:**
855
856| 错误码ID | 错误信息               |
857| -------- | ---------------------- |
858| 17620001 | memory error.           |
859| 17630001 | crypto operation error. |
860
861**示例:**
862
863```javascript
864import cryptoFramework from "@ohos.security.cryptoFramework"
865
866var rand;
867try {
868    rand = cryptoFramework.createRandom();
869} catch (error) {
870    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
871}
872
873var promiseGenerateRand = rand.generateRandom(12);
874promiseGenerateRand.then(randData => {
875    console.error("[Promise]: rand result: " + randData.data);
876}).catch(error => {
877    console.error("[Promise]: error: " + error.message);
878});
879```
880
881### setSeed
882
883setSeed(seed : DataBlob) : void;
884
885设置指定的种子
886
887**系统能力:** SystemCapability.Security.CryptoFramework
888
889| 参数名   | 类型                  | 必填 | 说明       |
890| -------- | --------------------- | ---- | ---------- |
891| seed     | DataBlob              | 是   | 设置的种子 |
892
893**错误码:**
894
895| 错误码ID | 错误信息           |
896| -------- | ----------------- |
897| 17620001 | memory error.      |
898
899**示例:**
900
901```javascript
902import cryptoFramework from "@ohos.security.cryptoFramework"
903
904var rand;
905try {
906    rand = cryptoFramework.createRandom();
907} catch (error) {
908    console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
909}
910
911rand.generateRandom(12, (err, randData) => {
912    if (err) {
913        console.error("[Callback] err: " + err.code);
914    } else {
915        console.error("[Callback]: generate random result: " + randData.data);
916        try {
917            rand.setSeed(randData);
918        } catch (error) {
919            console.log("setSeed failed, errCode: " + error.code + ", errMsg: " + error.message);
920        }
921    }
922});
923```
924
925## ParamsSpec
926
927加解密参数,在进行对称加解密时需要构造其子类对象,并将子类对象传入[init()](#init-2)方法。<br/>适用于需要iv等参数的对称加解密模式(对于无iv等参数的模式如ECB模式,无需构造,在[init()](#init-2)中传入null即可)。
928
929**系统能力:** SystemCapability.Security.CryptoFramework
930
931| 名称    | 类型   | 可读 | 可写 | 说明                                                         |
932| ------- | ------ | ---- | ---- | ------------------------------------------------------------ |
933| algName | string | 是   | 是   | 指明对称加解密参数的算法模式。可选值如下:<br/>- "IvParamsSpec": 适用于CBC\|CTR\|OFB\|CFB模式<br/>- "GcmParamsSpec": 适用于GCM模式<br/>- "CcmParamsSpec": 适用于CCM模式 |
934
935> **说明:**
936> 由于[init()](#init-2)的params参数是ParamsSpec类型(父类),而实际需要传入具体的子类对象(如IvParamsSpec),因此在构造子类对象时应设置其父类ParamsSpec的algName参数,使算法库在init()时知道传入的是哪种子类对象。
937
938## IvParamsSpec
939
940加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。<br/>适用于CBC、CTR、OFB、CFB这些仅使用iv作为参数的加解密模式。
941
942**系统能力:** SystemCapability.Security.CryptoFramework
943
944| 名称 | 类型                  | 可读 | 可写 | 说明                                                         |
945| ---- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
946| iv   | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数iv。常见取值如下:<br/>- AES的CBC\|CTR\|OFB\|CFB模式:iv长度为16字节<br/>- 3DES的CBC\|OFB\|CFB模式:iv长度为8字节 |
947
948> **说明:**
949> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
950
951## GcmParamsSpec
952
953加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。<br/>适用于GCM模式。
954
955**系统能力:** SystemCapability.Security.CryptoFramework
956
957| 名称    | 类型                  | 可读 | 可写 | 说明                                                         |
958| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
959| iv      | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数iv,长度为12字节                               |
960| aad     | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数aad,长度为8字节                               |
961| authTag | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数authTag,长度为16字节。<br/>采用GCM模式加密时,需要获取[doFinal()](#dofinal-2)输出的[DataBlob](#datablob),取出其末尾16字节作为解密时[init()](#init-2)方法的入参[GcmParamsSpec](#gcmparamsspec)中的的authTag |
962
963> **说明:**
964> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
965
966## CcmParamsSpec
967
968加解密参数[ParamsSpec](#paramsspec)的子类,用于在对称加解密时作为[init()](#init-2)方法的参数。<br/>适用于CCM模式。
969
970**系统能力:** SystemCapability.Security.CryptoFramework
971
972| 名称    | 类型                  | 可读 | 可写 | 说明                                                         |
973| ------- | --------------------- | ---- | ---- | ------------------------------------------------------------ |
974| iv      | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数iv,长度为7字节                                |
975| aad     | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数aad,长度为8字节                               |
976| authTag | [DataBlob](#datablob) | 是   | 是   | 指明加解密参数authTag,长度为12字节。<br/>采用CCM模式加密时,需要获取[doFinal()](#dofinal-2)输出的[DataBlob](#datablob),取出其末尾12字节作为解密时[init()](#init-2)方法的入参[CcmParamsSpec](#ccmparamsspec)中的authTag |
977
978> **说明:**
979> 传入[init()](#init-2)方法前需要指定其algName属性(来源于父类[ParamsSpec](#paramsspec))。
980
981## CryptoMode
982
983表示加解密操作的枚举。
984
985**系统能力:** SystemCapability.Security.CryptoFramework
986
987| 名称         | 值   | 说明             |
988| ------------ | ---- | ---------------- |
989| ENCRYPT_MODE | 0    | 表示进行加密操作 |
990| DECRYPT_MODE | 1    | 表示进行解密操作 |
991
992## Key
993
994密钥(父类),在运行密码算法(如加解密)时需要提前生成其子类对象,并传入[Cipher](#cipher)实例的[init()](#init-2)方法。<br/>密钥可以通过密钥生成器来生成。
995
996### 属性
997
998**系统能力:** SystemCapability.Security.CryptoFramework
999
1000| 名称    | 类型   | 可读 | 可写 | 说明                         |
1001| ------- | ------ | ---- | ---- | ---------------------------- |
1002| format  | string | 是   | 否   | 密钥的格式。                 |
1003| algName | string | 是   | 否   | 密钥对应的算法名(含长度)。 |
1004
1005### getEncoded
1006
1007getEncoded() : DataBlob
1008
1009以同步方法,获取16进制形式的密钥内容。
1010
1011**系统能力:** SystemCapability.Security.CryptoFramework
1012
1013**返回值:**
1014
1015| 类型                  | 说明                     |
1016| --------------------- | ------------------------ |
1017| [DataBlob](#datablob) | 用于查看密钥的具体内容。 |
1018
1019**示例:**
1020
1021```js
1022import cryptoFramework from "@ohos.security.cryptoFramework"
1023function uint8ArrayToShowStr(uint8Array) {
1024  return Array.prototype.map
1025    .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
1026    .join('');
1027}
1028
1029let key;    // key为使用对称密钥生成器 生成的密钥,此处省略生成过程
1030let encodedKey = key.getEncoded();
1031console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data));
1032```
1033
1034## SymKey
1035
1036对称密钥,是[Key](#key)的子类,在对称加解密时需要将其对象传入[Cipher](#cipher)实例的[init()](#init-2)方法使用。<br/>对称密钥可以通过对称密钥生成器[SymKeyGenerator](#symkeygenerator)来生成。
1037
1038### clearMem
1039
1040clearMem() : void
1041
1042以同步方法,将系统底层内存中的的密钥内容清零。建议在不再使用对称密钥实例时,调用本函数,避免内存中密钥数据存留过久。
1043
1044**系统能力:** SystemCapability.Security.CryptoFramework
1045
1046**示例:**
1047
1048```js
1049import cryptoFramework from "@ohos.security.cryptoFramework"
1050function uint8ArrayToShowStr(uint8Array) {
1051  return Array.prototype.map
1052    .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
1053    .join('');
1054}
1055
1056let key;    // key为使用对称密钥生成器 生成的密钥,此处省略生成过程
1057let encodedKey = key.getEncoded();
1058console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data));    // 输出密钥内容
1059key.clearMem();
1060encodedKey = key.getEncoded();
1061console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data));    // 输出全零
1062```
1063
1064## PubKey
1065
1066公钥,是Key的子类,在非对称加解密、验签、密钥协商时需要将其对象作为输入使用。<br/>公钥可以通过非对称密钥生成器AsyKeyGenerator来生成。
1067
1068### 属性
1069
1070**系统能力:** SystemCapability.Security.CryptoFramework
1071
1072| 名称    | 类型   | 可读 | 可写 | 说明                         |
1073| ------- | ------ | ---- | ---- | ---------------------------- |
1074| format  | string | 是   | 否   | 密钥的格式。                 |
1075| algName | string | 是   | 否   | 密钥对应的算法名(含长度)。 |
1076
1077
1078### getEncoded
1079
1080getEncoded() : DataBlob
1081
1082以同步方法,获取二进制形式的密钥内容。公钥格式满足ASN.1语法、X.509规范、DER编码格式。
1083
1084**系统能力:** SystemCapability.Security.CryptoFramework
1085
1086**返回值:**
1087
1088| 类型                  | 说明                     |
1089| --------------------- | ------------------------ |
1090| [DataBlob](#datablob) | 用于查看密钥的具体内容。 |
1091
1092**示例:**
1093
1094```js
1095function uint8ArrayToShowStr(uint8Array) {
1096  return Array.prototype.map
1097    .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
1098    .join('');
1099}
1100
1101let key; // key为使用非对称密钥生成器生成的非对称密钥的公钥对象,此处省略生成过程
1102console.info("key format:" + key.format);
1103console.info("key algName:" + key.algName);
1104var encodedKey = key.getEncoded();
1105console.info("key encoded:" + uint8ArrayToShowStr(encodedKey.data));
1106```
1107
1108## PriKey
1109
1110私钥,是Key的子类,在非对称加解密、签名、密钥协商时需要将其作为输入使用。<br/>私钥可以通过非对称密钥生成器AsyKeyGenerator来生成。
1111
1112### 属性
1113
1114**系统能力:** SystemCapability.Security.CryptoFramework
1115
1116| 名称    | 类型   | 可读 | 可写 | 说明                         |
1117| ------- | ------ | ---- | ---- | ---------------------------- |
1118| format  | string | 是   | 否   | 密钥的格式。                 |
1119| algName | string | 是   | 否   | 密钥对应的算法名(含长度)。 |
1120
1121### getEncoded
1122
1123getEncoded() : DataBlob
1124
1125以同步方法,获取二进制形式的密钥内容。私钥格式满足ASN.1语法,PKCS#8规范、DER编码方式。
1126
1127**系统能力:** SystemCapability.Security.CryptoFramework
1128
1129**返回值:**
1130
1131| 类型                  | 说明                     |
1132| --------------------- | ------------------------ |
1133| [DataBlob](#datablob) | 用于查看密钥的具体内容。 |
1134
1135**示例:**
1136
1137```js
1138function uint8ArrayToShowStr(uint8Array) {
1139  return Array.prototype.map
1140    .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
1141    .join('');
1142}
1143
1144let key; // key为使用非对称密钥生成器生成的非对称密钥的私钥对象,此处省略生成过程
1145console.info("key format:" + key.format);
1146console.info("key algName:" + key.algName);
1147var encodedKey = key.getEncoded();
1148console.info("key encoded:" + uint8ArrayToShowStr(encodedKey.data));
1149```
1150
1151### clearMem
1152
1153clearMem() : void
1154
1155以同步方法,将系统底层内存中的的密钥内容清零。
1156
1157**系统能力:** SystemCapability.Security.CryptoFramework
1158
1159**示例:**
1160
1161```js
1162let key; // key为使用非对称密钥生成器生成的非对称密钥的私钥对象,此处省略生成过程
1163key.clearMem();
1164```
1165
1166## KeyPair
1167
1168非对称密钥对,包含:公钥与私钥。<br/>可以通过非对称密钥生成器AsyKeyGenerator来生成。
1169
1170> **说明:**
1171>
1172> KeyPair对象中的pubKey对象和priKey对象,作为KeyPair对象中的一个参数存在,当离开KeyPair对象作用域时,其内部对象可能被析构。<br/>业务方使用时应持有KeyPair对象的引用,而非内部pubKey或priKey对象的引用。
1173
1174### 属性
1175
1176**系统能力:** SystemCapability.Security.CryptoFramework
1177
1178| 名称    | 类型   | 可读 | 可写 | 说明           |
1179| ------- | ------ | ---- | ---- | ------------ |
1180| priKey  | [PriKey](#prikey) | 是   | 否   | 私钥。      |
1181| pubKey | [PubKey](#pubkey) | 是   | 否   | 公钥。       |
1182
1183
1184## cryptoFramework.createSymKeyGenerator
1185
1186createSymKeyGenerator(algName : string) : SymKeyGenerator
1187
1188通过指定算法名称的字符串,获取相应的对称密钥生成器实例。<br/>支持的规格详见框架概述“[密钥生成规格](../../security/cryptoFramework-overview.md#密钥生成规格)”一节。
1189
1190**系统能力:** SystemCapability.Security.CryptoFramework
1191
1192**参数:**
1193
1194| 参数名  | 类型   | 必填 | 说明                                                         |
1195| ------- | ------ | ---- | ------------------------------------------------------------ |
1196| algName | string | 是   | 待生成对称密钥生成器的算法名称。<br/>具体取值详见框架概述“[密钥生成规格](../../security/cryptoFramework-overview.md#密钥生成规格)”一节中的“字符串参数”。 |
1197
1198**返回值:**
1199
1200| 类型                                | 说明                       |
1201| ----------------------------------- | -------------------------- |
1202| [SymKeyGenerator](#symkeygenerator) | 返回对称密钥生成器的对象。 |
1203
1204**示例:**
1205
1206```js
1207import cryptoFramework from '@ohos.security.cryptoFramework';
1208let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');
1209```
1210
1211## SymKeyGenerator
1212
1213对称密钥生成器。<br/>在使用该类的方法前,需要先使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)方法构建一个symKeyGenerator实例。
1214
1215### 属性
1216
1217**系统能力:** SystemCapability.Security.CryptoFramework
1218
1219| 名称    | 类型   | 可读 | 可写 | 说明                           |
1220| ------- | ------ | ---- | ---- | ------------------------------ |
1221| algName | string | 是   | 否   | 对称密钥生成器指定的算法名称。 |
1222
1223### generateSymKey
1224
1225generateSymKey(callback : AsyncCallback\<SymKey>) : void
1226
1227异步获取对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。<br/>必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。<br/>目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
1228
1229**系统能力:** SystemCapability.Security.CryptoFramework
1230
1231**参数:**
1232
1233| 参数名     | 类型                              | 必填 | 说明                                                         |
1234| -------- | --------------------------------- | ---- | ------------------------------------------------------------ |
1235| callback | AsyncCallback\<[SymKey](#symkey)> | 是   | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 |
1236
1237**错误码:**
1238
1239| 错误码ID | 错误信息      |
1240| -------- | ------------- |
1241| 17620001 | memory error. |
1242
1243**示例:**
1244
1245```js
1246import cryptoFramework from '@ohos.security.cryptoFramework';
1247let symAlgName = '3DES192';
1248let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
1249symKeyGenerator.generateSymKey((err, symKey) => {
1250  if (err) {
1251    console.error(`Generate symKey failed, ${err.code}, ${err.message}`);
1252  } else {
1253    console.info(`Generate symKey success, algName: ${symKey.algName}`);
1254  }
1255})
1256```
1257
1258### generateSymKey
1259
1260generateSymKey() : Promise\<SymKey>
1261
1262异步获取该对称密钥生成器随机生成的密钥,通过Promise获取结果。<br/>必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。<br/>目前支持使用OpenSSL的RAND_priv_bytes()作为底层能力生成随机密钥。
1263
1264**系统能力:** SystemCapability.Security.CryptoFramework
1265
1266**返回值:**
1267
1268| 类型                        | 说明                              |
1269| --------------------------- | --------------------------------- |
1270| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 |
1271
1272**错误码:**
1273
1274| 错误码ID | 错误信息      |
1275| -------- | ------------- |
1276| 17620001 | memory error. |
1277
1278**示例:**
1279
1280```js
1281import cryptoFramework from '@ohos.security.cryptoFramework';
1282let symAlgName = 'AES128';
1283let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
1284symKeyGenerator.generateSymKey()
1285.then(symKey => {
1286  console.info(`Generate symKey success, algName: ${symKey.algName}`);
1287}, error => {
1288  console.error(`Generate symKey failed, ${error.code}, ${error.message}`);
1289})
1290```
1291
1292### convertKey
1293
1294convertKey(key : DataBlob, callback : AsyncCallback\<SymKey>) : void
1295
1296异步根据指定数据生成对称密钥,通过注册回调函数获取结果。<br/>必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1297
1298**系统能力:** SystemCapability.Security.CryptoFramework
1299
1300**参数:**
1301
1302| 参数名     | 类型                              | 必填 | 说明                                                         |
1303| -------- | --------------------------------- | ---- | ------------------------------------------------------------ |
1304| key      | [DataBlob](#datablob)             | 是   | 指定的对称密钥材料。                                         |
1305| callback | AsyncCallback\<[SymKey](#symkey)> | 是   | 回调函数。当生成对称密钥成功,err为undefined,data为获取到的SymKey;否则为错误对象。 |
1306
1307**错误码:**
1308
1309| 错误码ID | 错误信息                                               |
1310| -------- | --------------------------------------------------- |
1311| 17620001 | memory error.                                       |
1312
1313**示例:**
1314
1315```js
1316import cryptoFramework from '@ohos.security.cryptoFramework';
1317
1318function genKeyMaterialBlob() {
1319  let arr = [
1320    0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
1321    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
1322    0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72];    // keyLen = 192 (24 bytes)
1323  let keyMaterial = new Uint8Array(arr);
1324  return {data : keyMaterial};
1325}
1326
1327let symAlgName = '3DES192';
1328let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
1329let keyMaterialBlob = genKeyMaterialBlob();
1330symKeyGenerator.convertKey(keyMaterialBlob, (err, symKey) => {
1331  if (err) {
1332    console.error(`Convert symKey failed, ${err.code}, ${err.message}`);
1333  } else {
1334    console.info(`Convert symKey success, algName: ${symKey.algName}`);
1335  }
1336})
1337```
1338
1339### convertKey
1340
1341convertKey(key : DataBlob) : Promise\<SymKey>
1342
1343异步根据指定数据生成对称密钥,通过Promise获取结果。<br/>必须在使用[createSymKeyGenerator](#cryptoframeworkcreatesymkeygenerator)创建对称密钥生成器后,才能使用本函数。
1344
1345**系统能力:** SystemCapability.Security.CryptoFramework
1346
1347**参数:**
1348
1349| 参数名 | 类型                  | 必填 | 说明                 |
1350| ---- | --------------------- | ---- | -------------------- |
1351| key  | [DataBlob](#datablob) | 是   | 指定的密钥材料数据。 |
1352
1353**返回值:**
1354
1355| 类型                        | 说明                              |
1356| --------------------------- | --------------------------------- |
1357| Promise\<[SymKey](#symkey)> | Promise对象,返回对称密钥SymKey。 |
1358
1359**错误码:**
1360
1361| 错误码ID | 错误信息                                          |
1362| -------- | --------------------------------------------- |
1363| 17620001 | memory error.                                |
1364
1365**示例:**
1366
1367```js
1368import cryptoFramework from '@ohos.security.cryptoFramework';
1369
1370function genKeyMaterialBlob() {
1371  let arr = [
1372    0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
1373    0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
1374    0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72];    // keyLen = 192 (24 bytes)
1375  let keyMaterial = new Uint8Array(arr);
1376  return {data : keyMaterial};
1377}
1378
1379let symAlgName = '3DES192';
1380let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
1381let keyMaterialBlob = genKeyMaterialBlob();
1382symKeyGenerator.convertKey(keyMaterialBlob)
1383.then(symKey => {
1384  console.info(`Convert symKey success, algName: ${symKey.algName}`);
1385}, error => {
1386  console.error(`Convert symKey failed, ${error.code}, ${error.message}`);
1387})
1388```
1389
1390## cryptoFramework.createAsyKeyGenerator
1391
1392createAsyKeyGenerator(algName : string) : AsyKeyGenerator
1393
1394通过指定算法名称的字符串,获取相应的非对称密钥生成器实例。<br/>支持的规格详见框架概述“[密钥生成规格](../../security/cryptoFramework-overview.md#密钥生成规格)”一节。
1395
1396**系统能力:** SystemCapability.Security.CryptoFramework
1397
1398**参数:**
1399
1400| 参数名  | 类型   | 必填 | 说明                             |
1401| ------- | ------ | ---- | -------------------------------- |
1402| algName | string | 是   | 待生成对称密钥生成器的算法名称。 |
1403
1404**返回值:**
1405
1406| 类型            | 说明                         |
1407| --------------- | ---------------------------- |
1408| [AsyKeyGenerator](#asykeygenerator) | 返回非对称密钥生成器的对象。 |
1409
1410**示例:**
1411
1412```javascript
1413import cryptoFramework from "@ohos.security.cryptoFramework"
1414
1415let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
1416```
1417
1418## AsyKeyGenerator
1419
1420非对称密钥生成器。在使用该类的方法前,需要先使用createAsyKeyGenerator()方法构建一个AsyKeyGenerator实例。
1421
1422### 属性
1423
1424**系统能力:** SystemCapability.Security.CryptoFramework
1425
1426| 名称    | 类型   | 可读 | 可写 | 说明                             |
1427| ------- | ------ | ---- | ---- | -------------------------------- |
1428| algName | string | 是   | 否   | 非对称密钥生成器指定的算法名称。 |
1429
1430### generateKeyPair
1431
1432generateKeyPair(callback : AsyncCallback\<KeyPair>) : void;
1433
1434异步获取非对称密钥生成器随机生成的密钥,通过注册回调函数获取结果。
1435
1436**系统能力:** SystemCapability.Security.CryptoFramework
1437
1438**参数:**
1439
1440| 参数名     | 类型                    | 必填 | 说明                           |
1441| -------- | ----------------------- | ---- | ------------------------------ |
1442| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
1443
1444**错误码:**
1445
1446| 错误码ID | 错误信息               |
1447| -------- | ---------------------- |
1448| 17620001 | memory error.          |
1449
1450**示例:**
1451
1452```javascript
1453import cryptoFramework from "@ohos.security.cryptoFramework"
1454
1455let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
1456asyKeyGenerator.generateKeyPair((err, keyPair) => {
1457  if (err) {
1458    console.error("generateKeyPair: error.");
1459    return;
1460  }
1461  console.info("generateKeyPair: success.");
1462})
1463```
1464
1465
1466### generateKeyPair
1467
1468generateKeyPair() : Promise\<KeyPair>
1469
1470异步获取该非对称密钥生成器随机生成的密钥,通过Promise获取结果。
1471
1472**系统能力:** SystemCapability.Security.CryptoFramework
1473
1474**返回值:**
1475
1476| 类型              | 说明                              |
1477| ----------------- | --------------------------------- |
1478| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
1479
1480**错误码:**
1481
1482| 错误码ID | 错误信息               |
1483| -------- | ---------------------- |
1484| 17620001 | memory error.          |
1485
1486**示例:**
1487
1488```javascript
1489import cryptoFramework from "@ohos.security.cryptoFramework"
1490
1491let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
1492let keyGenPromise = asyKeyGenerator.generateKeyPair();
1493keyGenPromise.then( keyPair => {
1494  console.info("generateKeyPair success.");
1495}).catch(error => {
1496  console.error("generateKeyPair error.");
1497});
1498```
1499
1500### convertKey
1501
1502convertKey(pubKey : DataBlob, priKey : DataBlob, callback : AsyncCallback\<KeyPair\>) : void
1503
1504异步获取指定数据生成非对称密钥,通过注册回调函数获取结果。详情请看下方**密钥转换说明**
1505
1506**系统能力:** SystemCapability.Security.CryptoFramework
1507
1508**参数:**
1509
1510| 参数名     | 类型       | 必填 | 说明                           |
1511| -------- | ----------- | ---- | ------------------------------ |
1512| pubKey   | [DataBlob](#datablob)     | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null。        |
1513| priKey   | [DataBlob](#datablob)     | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null。        |
1514| callback | AsyncCallback\<[KeyPair](#keypair)> | 是   | 回调函数,用于获取非对称密钥。 |
1515
1516**错误码:**
1517
1518| 错误码ID | 错误信息               |
1519| -------- | ---------------------- |
1520| 17620001 | memory error.          |
1521
1522**示例:**
1523
1524```javascript
1525import cryptoFramework from "@ohos.security.cryptoFramework"
1526let pubKey; // X.509规范、DER格式的公钥数据,此处省略数据。
1527let priKey; // PKCS#8规范、DER格式的私钥数据,此处省略数据。
1528let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
1529asyKeyGenerator.convertKey(pubKey, priKey, (err, keyPair) => {
1530  if (err) {
1531    console.error("convertKey: error.");
1532    return;
1533  }
1534  console.info("convertKey: success.");
1535})
1536```
1537
1538### convertKey
1539
1540convertKey(pubKey : DataBlob, priKey : DataBlob) : Promise\<KeyPair>
1541
1542异步获取指定数据生成非对称密钥,通过Promise获取结果。详情请看下方**密钥转换说明**
1543
1544**系统能力:** SystemCapability.Security.CryptoFramework
1545
1546**参数:**
1547
1548| 参数名   | 类型    | 必填 | 说明             |
1549| ------ | -------- | ---- | ---------------- |
1550| pubKey | DataBlob | 是   | 指定的公钥材料。如果公钥不需要转换,可直接传入null |
1551| priKey | DataBlob | 是   | 指定的私钥材料。如果私钥不需要转换,可直接传入null |
1552
1553**返回值:**
1554
1555| 类型              | 说明                              |
1556| ----------------- | --------------------------------- |
1557| Promise\<[KeyPair](#keypair)> | 使用Promise的方式获取非对称密钥。 |
1558
1559**错误码:**
1560
1561| 错误码ID | 错误信息               |
1562| -------- | ---------------------- |
1563| 17620001 | memory error.          |
1564
1565**示例:**
1566
1567```javascript
1568import cryptoFramework from "@ohos.security.cryptoFramework"
1569
1570let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
1571let pubKey; // pubKey为使用非对称密钥生成器生成的非对称密钥的公钥对象,此处省略生成过程
1572let priKey; // priKey为使用非对称密钥生成器生成的非对称密钥的私钥对象,此处省略生成过程
1573let keyGenPromise = asyKeyGenerator.convertKey(pubKey, priKey);
1574keyGenPromise.then( keyPair => {
1575  console.info("convertKey success.");
1576}).catch(error => {
1577  console.error("convertKey error.");
1578});
1579```
1580
1581**密钥转换说明**
1582
15831. 非对称密钥(RSA、ECC)的公钥和私钥调用getEncoded()方法后,分别返回X.509格式和PKCS#8格式的二进制数据,此数据可用于跨应用传输或持久化存储。
15842. 当调用convertKey方法将外来二进制数据转换为算法库非对称密钥对象时,公钥应满足ASN.1语法、X.509规范、DER编码格式,私钥应满足ASN.1语法、PKCS#8规范、DER编码格式。
15853. convertKey方法中,公钥和密钥二进制数据非必选项,可单独传入公钥或私钥的数据,生成对应只包含公钥或私钥的KeyPair对象。
1586
1587## cryptoFramework.createCipher
1588
1589createCipher(transformation : string) : Cipher
1590
1591通过指定算法名称,获取相应的[Cipher](#cipher)实例。<br/>支持的规格详见框架概述“[加解密规格](../../security/cryptoFramework-overview.md#加解密规格)”一节。
1592
1593**系统能力:** SystemCapability.Security.CryptoFramework
1594
1595**参数:**
1596
1597| 参数名         | 类型   | 必填 | 说明                                                         |
1598| -------------- | ------ | ---- | ------------------------------------------------------------ |
1599| transformation | string | 是   | 待生成Cipher的算法名称(含密钥长度)、加密模式以及填充方法的组合。<br/>具体取值详见框架概述“[加解密规格](../../security/cryptoFramework-overview.md#加解密规格)”一节中的“字符串参数”。 |
1600
1601> **说明:**
1602> 1. 目前对称加解密中,PKCS5和PKCS7的实现相同,其padding长度和分组长度保持一致(即PKCS5和PKCS7在3DES中均按照8字节填充,在AES中均按照16字节填充),另有NoPadding表示不填充。<br/>开发者需要自行了解密码学不同分组模式的差异,以便选择合适的参数规格。例如选择ECB和CBC模式时,建议启用填充,否则必须确保明文长度是分组大小的整数倍;选择其他模式时,可以不启用填充,此时密文长度和明文长度一致(即可能不是分组大小的整数倍)。
1603> 2. 使用RSA进行非对称加解密时,必须创建两个Cipher对象分别进行加密和解密操作,而不能对同一个Cipher对象进行加解密。对称加解密没有此要求(即只要算法规格一样,可以对同一个Cipher对象进行加解密操作)。
1604
1605**返回值:**
1606
1607| 类型              | 说明                     |
1608| ----------------- | ------------------------ |
1609| [Cipher](#cipher) | 返回加解密生成器的对象。 |
1610
1611**示例:**
1612
1613```javascript
1614import cryptoFramework from "@ohos.security.cryptoFramework"
1615
1616let cipherAlgName = '3DES192|ECB|PKCS7';
1617var cipher;
1618try {
1619  cipher = cryptoFramework.createCipher(cipherAlgName);
1620  console.info(`cipher algName: ${cipher.algName}`);
1621} catch (error) {
1622  console.error(`createCipher failed, ${error.code}, ${error.message}`);
1623}
1624```
1625
1626## Cipher
1627
1628提供加解密的算法操作功能,按序调用本类中的[init()](#init-2)、[update()](#update-4)、[doFinal()](#dofinal-2)方法,可以实现对称加密/对称解密/非对称加密/非对称解密。<br/>完整的加解密流程示例可参考开发指导中的“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”一节。
1629
1630一次完整的加/解密流程在对称加密和非对称加密中略有不同:
1631
1632- 对称加解密:init为必选,update为可选(且允许多次update加/解密大数据),doFinal为必选;doFinal结束后可以重新init开始新一轮加/解密流程。
1633- RSA非对称加解密:init为必选,不支持update操作,doFinal为必选(允许连续多次doFinal加/解密大数据);RSA不支持重复init,切换加解密模式或填充方式时,需要重新创建Cipher对象。
1634
1635### 属性
1636
1637**系统能力:** SystemCapability.Security.CryptoFramework
1638
1639
1640| 名称    | 类型   | 可读 | 可写 | 说明                         |
1641| ------- | ------ | ---- | ---- | ---------------------------- |
1642| algName | string | 是   | 否   | 加解密生成器指定的算法名称。 |
1643
1644### init
1645
1646init(opMode : CryptoMode, key : Key, params : ParamsSpec, callback : AsyncCallback\<void>) : void
1647
1648初始化加解密的[cipher](#cipher)对象,通过注册回调函数获取结果。<br/>必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
1649
1650**系统能力:** SystemCapability.Security.CryptoFramework
1651
1652**参数:**
1653
1654| 参数名     | 类型                      | 必填 | 说明                                                         |
1655| -------- | ------------------------- | ---- | ------------------------------------------------------------ |
1656| opMode   | [CryptoMode](#cryptomode) | 是   | 加密或者解密模式。                                           |
1657| key      | [Key](#key)               | 是   | 指定加密或解密的密钥。                                       |
1658| params   | [ParamsSpec](#paramsspec) | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 |
1659| callback | AsyncCallback\<void>      | 是   | 回调函数。当初始化成功,err为undefined,否则为错误对象。     |
1660
1661**错误码:**
1662
1663| 错误码ID | 错误信息                                                 |
1664| -------- | --------------------------------------------------------- |
1665| 17620001 | memory error.                                            |
1666| 17620002 | runtime error.                                           |
1667| 17630001 | crypto operation error.|
1668
1669**示例:**
1670
1671```js
1672import cryptoFramework from '@ohos.security.cryptoFramework';
1673let symKey;     // 此处省略生成对称密钥的过程
1674let cipher;         // 此处省略生成cipher实例的过程
1675
1676cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null, (err, ) => {
1677  if (err) {
1678    console.error(`Failed to init cipher, ${err.code}, ${err.message}`);
1679  } else {
1680    console.info(`Init cipher success`);
1681    // 此处进行update等后续操作
1682  }
1683})
1684```
1685
1686### init
1687
1688init(opMode : CryptoMode, key : Key, params : ParamsSpec) : Promise\<void>
1689
1690初始化加解密的cipher对象,通过Promise获取结果。<br/>必须在使用[createCipher](#cryptoframeworkcreatecipher)创建[Cipher](#cipher)实例后,才能使用本函数。
1691
1692**系统能力:** SystemCapability.Security.CryptoFramework
1693
1694**参数:**
1695
1696| 参数名   | 类型                      | 必填 | 说明                                                         |
1697| ------ | ------------------------- | ---- | ------------------------------------------------------------ |
1698| opMode | [CryptoMode](#cryptomode) | 是   | 加密或者解密模式。                                           |
1699| key    | [Key](#key)               | 是   | 指定加密或解密的密钥。                                       |
1700| params | [ParamsSpec](#paramsspec) | 是   | 指定加密或解密的参数,对于ECB等没有参数的算法模式,可以传入null。 |
1701
1702**返回值:**
1703
1704| 类型           | 说明                                   |
1705| -------------- | -------------------------------------- |
1706| Promise\<void> | Promise对象。无返回结果的Promise对象。 |
1707
1708**错误码:**
1709
1710| 错误码ID | 错误信息                                          |
1711| -------- | ------------------------------------------------- |
1712| 17620001 | memory error.                                     |
1713| 17620002 | runtime error.                                    |
1714| 17630001 | crypto operation error.|
1715
1716**示例:**
1717
1718```js
1719import cryptoFramework from '@ohos.security.cryptoFramework';
1720let symKey;     // 此处省略生成对称密钥的过程
1721let cipher;         // 此处省略生成cipher实例的过程
1722cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null)
1723.then(() => {
1724  console.info(`Init cipher success`);
1725  // 此处进行update等后续操作
1726}, error => {
1727  console.error(`Failed to init cipher, ${error.code}, ${error.message}`);
1728})
1729```
1730
1731### update
1732
1733update(data : DataBlob, callback : AsyncCallback\<DataBlob>) : void
1734
1735分段更新加密或者解密数据操作,通过注册回调函数获取加/解密数据。 <br/>必须在对[Cipher](#cipher)实例使用[init()](init-2)初始化后,才能使用本函数。
1736
1737> **说明:**
1738> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和[doFinal](#dofinal-2)结果产生影响。<br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。)
1739> 2. 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[doFinal](#dofinal-2))或多次调用update。<br/>算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,采用多次update的方式传入数据。<br/>AES使用多次update操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
1740> 3. RSA非对称加解密不支持update操作。
1741
1742**系统能力:** SystemCapability.Security.CryptoFramework
1743
1744**参数:**
1745
1746| 参数名     | 类型                                  | 必填 | 说明                                                         |
1747| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
1748| data     | [DataBlob](#datablob)                 | 是   | 加密或者解密的数据。data不能为null,也不允许传入{data : Uint8Array(空) }            |
1749| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。当更新加/解密数据成功,err为undefined,data为此次更新的加/解密结果DataBlob;否则为错误对象。 |
1750
1751**错误码:**
1752
1753| 错误码ID | 错误信息                                    |
1754| -------- | ------------------------------------------- |
1755| 17620001 | memory error.                               |
1756| 17620002 | runtime error.                              |
1757| 17630001 | crypto operation error.                     |
1758
1759**示例:**
1760
1761```js
1762import cryptoFramework from '@ohos.security.cryptoFramework';
1763
1764function stringToUint8Array(str) {
1765  let arr = [];
1766  for (let i = 0, j = str.length; i < j; ++i) {
1767    arr.push(str.charCodeAt(i));
1768  }
1769  return new Uint8Array(arr);
1770}
1771
1772let cipher;         // 此处省略生成cipher实例的过程
1773// 此处省略init()过程
1774let plainText = {data : stringToUint8Array('this is test!')};
1775cipher.update(plainText, (err, output) => {       // 加密过程举例
1776  if (err) {
1777    console.error(`Failed to update cipher`);
1778  } else {
1779    console.info(`Update cipher success`);
1780    if (output != null) {
1781      // 拼接output.data到密文
1782    }
1783    // 此处进行doFinal等后续操作
1784  }
1785})
1786```
1787
1788### update
1789
1790update(data : DataBlob) : Promise\<DataBlob>
1791
1792分段更新加密或者解密数据操作,通过通过Promise获取加/解密数据。<br/>必须在对[Cipher](#cipher)实例使用[init()](init-2)初始化后,才能使用本函数。
1793
1794> **说明:**
1795> 1. 在进行对称加解密操作的时候,如果开发者对各个分组模式不够熟悉,建议对每次update和doFinal的结果都判断是否为null,并在结果不为null时取出其中的数据进行拼接,形成完整的密文/明文。这是因为选择的分组模式等各项规格都可能对update和[doFinal](#dofinal-2)结果产生影响。<br/>(例如对于ECB和CBC模式,不论update传入的数据是否为分组长度的整数倍,都会以分组作为基本单位进行加/解密,并输出本次update新产生的加/解密分组结果。<br/>可以理解为,update只要凑满一个新的分组就会有输出,如果没有凑满则此次update输出为null,把当前还没被加/解密的数据留着,等下一次update/doFinal传入数据的时候,拼接起来继续凑分组。<br/>最后doFinal的时候,会把剩下的还没加/解密的数据,根据[createCipher](#cryptoframeworkcreatecipher)时设置的padding模式进行填充,补齐到分组的整数倍长度,再输出剩余加解密结果。<br/>而对于可以将分组密码转化为流模式实现的模式,还可能出现密文长度和明文长度相同的情况等。)
1796> 2. 根据数据量,可以不调用update(即[init](#init-2)完成后直接调用[doFinal](#dofinal-2))或多次调用update。<br/>算法库目前没有对update(单次或累计)的数据量设置大小限制,建议对于大数据量的对称加解密,可以采用多次update的方式传入数据。<br/>AES使用多次update操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
1797> 3. RSA非对称加解密不支持update操作。
1798
1799**系统能力:** SystemCapability.Security.CryptoFramework
1800
1801**参数:**
1802
1803| 参数名 | 类型                  | 必填 | 说明                 |
1804| ---- | --------------------- | ---- | -------------------- |
1805| data | [DataBlob](#datablob) | 是   | 加密或者解密的数据。data不能为null,也不允许传入{data : Uint8Array(空) } |
1806
1807**返回值:**
1808
1809| 类型                            | 说明                                             |
1810| ------------------------------- | ------------------------------------------------ |
1811| Promise\<[DataBlob](#datablob)> | Promise对象,返回此次更新的加/解密结果DataBlob。 |
1812
1813**错误码:**
1814
1815| 错误码ID | 错误信息                                     |
1816| -------- | -------------------------------------------- |
1817| 17620001 | memory error.                                |
1818| 17620002 | runtime error.                               |
1819| 17630001 | crypto operation error.                      |
1820
1821**示例:**
1822
1823```js
1824import cryptoFramework from '@ohos.security.cryptoFramework';
1825
1826function stringToUint8Array(str) {
1827  let arr = [];
1828  for (let i = 0, j = str.length; i < j; ++i) {
1829    arr.push(str.charCodeAt(i));
1830  }
1831  return new Uint8Array(arr);
1832}
1833
1834let cipher;         // 此处省略生成cipher实例的过程
1835// 此处省略init()过程
1836let plainText = {data : stringToUint8Array('this is test!')};
1837cipher.update(plainText)
1838.then((output) => {
1839  console.info(`Update cipher success.`);
1840  if (output != null) {
1841    // 拼接output.data到密文
1842  }
1843  // 此处进行doFinal等后续操作
1844}, error => {
1845  console.info(`Update cipher failed.`);
1846})
1847```
1848
1849### doFinal
1850
1851doFinal(data : DataBlob, callback : AsyncCallback\<DataBlob>) : void
1852
1853(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过注册回调函数获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用[update](#update-4)传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别:
1854
1855- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
1856- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。
1857
1858(2)在RSA非对称加解密中,doFinal加/解密本次传入的数据,通过注册回调函数获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。
1859
1860>  **说明:**
1861>  1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用[init()](init-2)并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。
1862>  2. 如果遇到解密失败,需检查加解密数据和[init](#init-2)时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。
1863>  3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。
1864>  4. RSA非对称加解密时多次doFinal操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
1865
1866**系统能力:** SystemCapability.Security.CryptoFramework
1867
1868**参数:**
1869
1870| 参数名     | 类型                                  | 必填 | 说明                                                         |
1871| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
1872| data     | [DataBlob](#datablob)                 | 是   | 加密或者解密的数据。在对称加解密中允许为null,但不允许传入{data : Uint8Array(空) }。       |
1873| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 回调函数。当最终加/解密数据成功,err为undefined,data为剩余数据的加/解密结果DataBlob;否则为错误对象。 |
1874
1875**错误码:**
1876
1877| 错误码ID | 错误信息                |
1878| -------- | ----------------------- |
1879| 17620001 | memory error.           |
1880| 17620002 | runtime error.          |
1881| 17630001 | crypto operation error. |
1882
1883**示例:**
1884
1885```js
1886import cryptoFramework from '@ohos.security.cryptoFramework';
1887
1888let cipher;         // 此处省略生成cipher实例的过程
1889let data;           // 此处省略准备待加密/解密数据的过程
1890// 此处省略init()和update()过程
1891cipher.doFinal(data, (err, output) => {
1892  if (err) {
1893    console.error(`Failed to finalize cipher, ${err.code}, ${err.message}`);
1894  } else {
1895    console.info(`Finalize cipher success`);
1896    if (output != null) {
1897      // 拼接output.data得到完整的明文/密文(及authTag)
1898    }
1899  }
1900})
1901```
1902
1903### doFinal
1904
1905doFinal(data : DataBlob) : Promise\<DataBlob>
1906
1907(1)在对称加解密中,doFinal加/解密(分组模式产生的)剩余数据和本次传入的数据,最后结束加密或者解密数据操作,通过Promise获取加密或者解密数据。<br/>如果数据量较小,可以在doFinal中一次性传入数据,而不使用update;如果在本次加解密流程中,已经使用[update](#update-4)传入过数据,可以在doFinal的data参数处传入null。<br/>根据对称加解密的模式不同,doFinal的输出有如下区别:
1908
1909- 对于GCM和CCM模式的对称加密:一次加密流程中,如果将每一次update和doFinal的结果拼接起来,会得到“密文+authTag”,即末尾的16字节(GCM模式)或12字节(CCM模式)是authTag,而其余部分均为密文。(也就是说,如果doFinal的data参数传入null,则doFinal的结果就是authTag)<br/>authTag需要填入解密时的[GcmParamsSpec](#gcmparamsspec)或[CcmParamsSpec](#ccmparamsspec);密文则作为解密时的入参data。
1910- 对于其他模式的对称加解密、GCM和CCM模式的对称解密:一次加/解密流程中,每一次update和doFinal的结果拼接起来,得到完整的明文/密文。
1911
1912(2)在RSA非对称加解密中,doFinal加/解密本次传入的数据,通过Promise获取加密或者解密数据。如果数据量较大,可以多次调用doFinal,拼接结果得到完整的明文/密文。
1913
1914>  **说明:**
1915>  1. 对称加解密中,调用doFinal标志着一次加解密流程已经完成,即[Cipher](#cipher)实例的状态被清除,因此当后续开启新一轮加解密流程时,需要重新调用[init()](init-2)并传入完整的参数列表进行初始化<br/>(比如即使是对同一个Cipher实例,采用同样的对称密钥,进行加密然后解密,则解密中调用init的时候仍需填写params参数,而不能直接省略为null)。
1916>  2. 如果遇到解密失败,需检查加解密数据和[init](#init-2)时的参数是否匹配,包括GCM模式下加密得到的authTag是否填入解密时的GcmParamsSpec等。
1917>  3. doFinal的结果可能为null,因此使用.data字段访问doFinal结果的具体数据前,请记得先判断结果是否为null,避免产生异常。
1918>  4. RSA非对称加解密时多次doFinal操作的示例代码详见开发指导“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”。
1919
1920**系统能力:** SystemCapability.Security.CryptoFramework
1921
1922**参数:**
1923
1924| 参数名 | 类型                  | 必填 | 说明                 |
1925| ---- | --------------------- | ---- | -------------------- |
1926| data | [DataBlob](#datablob) | 是   | 加密或者解密的数据。data参数允许为null,但不允许传入{data : Uint8Array(空) } |
1927
1928**返回值:**
1929
1930| 类型                            | 说明                                             |
1931| ------------------------------- | ------------------------------------------------ |
1932| Promise\<[DataBlob](#datablob)> | Promise对象,返回剩余数据的加/解密结果DataBlob。 |
1933
1934**错误码:**
1935
1936| 错误码ID | 错误信息                                     |
1937| -------- | -------------------------------------------- |
1938| 17620001 | memory error.                                |
1939| 17620002 | runtime error.                               |
1940| 17630001 | crypto operation error.                      |
1941
1942**示例:**
1943
1944```js
1945import cryptoFramework from '@ohos.security.cryptoFramework';
1946
1947let cipher;         // 此处省略生成cipher实例的过程
1948let data;           // 此处省略准备待加密/解密数据的过程
1949// 此处省略init()和update()过程
1950cipher.doFinal(data)
1951.then(output => {
1952  console.info(`Finalize cipher success`);
1953    if (output != null) {
1954    // 拼接output.data得到完整的明文/密文(及authTag)
1955  }
1956}, error => {
1957  console.error(`Failed to finalize cipher, ${error.code}, ${error.message}`);
1958})
1959```
1960
1961**使用RSA加密的callback完整示例:**
1962
1963```javascript
1964import cryptoFramework from "@ohos.security.cryptoFramework"
1965
1966function stringToUint8Array(str) {
1967  let arr = [];
1968  for (let i = 0, j = str.length; i < j; ++i) {
1969    arr.push(str.charCodeAt(i));
1970  }
1971  return new Uint8Array(arr);
1972}
1973
1974let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
1975let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
1976rsaGenerator.generateKeyPair(function (err, keyPair) {
1977  let pubKey = keyPair.pubKey;
1978  cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null, function (err, data) {
1979    let plainText = "this is cipher text";
1980    let input = {data : stringToUint8Array(plainText) };
1981    cipher.doFinal(input, function (err, data) {
1982      AlertDialog.show({ message : "EncryptOutPut is " + data.data} );
1983    });
1984  });
1985});
1986```
1987
1988**使用RSA加密的promise完整示例:**
1989
1990```javascript
1991import cryptoFramework from "@ohos.security.cryptoFramework"
1992
1993function stringToUint8Array(str) {
1994  let arr = [];
1995  for (let i = 0, j = str.length; i < j; ++i) {
1996    arr.push(str.charCodeAt(i));
1997  }
1998  return new Uint8Array(arr);
1999}
2000
2001let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
2002let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
2003let keyGenPromise = rsaGenerator.generateKeyPair();
2004keyGenPromise.then(rsaKeyPair => {
2005  let pubKey = rsaKeyPair.pubKey;
2006  return cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null); // 传入私钥和DECRYPT_MODE可初始化解密模式
2007}).then(() => {
2008  let plainText = "this is cipher text";
2009  let input = { data : stringToUint8Array(plainText) };
2010  return cipher.doFinal(input);
2011}).then(dataBlob => {
2012  console.info("EncryptOutPut is " + dataBlob.data);
2013});
2014```
2015
2016> **说明:**
2017> 更多加解密流程的完整示例可参考开发指导中的“[使用加解密操作](../../security/cryptoFramework-guidelines.md#使用加解密操作)”一节。
2018
2019## cryptoFramework.createSign
2020
2021createSign(algName : string) : Sign
2022
2023Sign实例生成。<br/>支持的规格详见框架概述“[签名验签规格](../../security/cryptoFramework-overview.md#签名验签规格)”一节。
2024
2025**系统能力:** SystemCapability.Security.CryptoFramework
2026
2027**参数:**
2028
2029| 参数名  | 类型   | 必填 | 说明                                                         |
2030| ------- | ------ | ---- | ------------------------------------------------------------ |
2031| algName | string | 是   | 指定签名算法:RSA或ECC,使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要 |
2032
2033**返回值**:
2034
2035| 类型 | 说明                             |
2036| ---- | -------------------------------- |
2037| Sign | 返回由输入算法指定生成的Sign对象 |
2038
2039**示例:**
2040
2041```javascript
2042import cryptoFramework from "@ohos.security.cryptoFramework"
2043
2044let signer1 = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
2045
2046let singer2 = cryptoFramework.createSign("RSA1024|PSS|SHA256|MGF1_SHA256")
2047```
2048
2049## Sign
2050
2051Sign类,使用Sign方法之前需要创建该类的实例进行操作,通过createSign(algName : string) : Sign方法构造此实例。Sign类不支持重复初始化,当业务方需要使用新密钥签名时,需要重新创建新Sign对象并调用init初始化。
2052
2053业务方使用时,在createSign时确定签名的模式,调用init接口设置密钥。
2054
2055当待签名数据较短时,可在init初始化后直接调用sign接口传入原文数据进行签名。
2056
2057当待签名数据较长时,可通过update接口分段传入切分后的原文数据,最后调用sign接口对整体原文数据进行签名。
2058
2059当使用update分段传入原文时,sign接口支持传null,业务方可在循环中调用update接口,循环结束后调用sign进行签名。
2060
2061### 属性
2062
2063**系统能力:** SystemCapability.Security.CryptoFramework
2064
2065| 名称    | 类型   | 可读 | 可写 | 说明                         |
2066| ------- | ------ | ---- | ---- | ---------------------------- |
2067| algName | string | 是   | 否   | 签名指定的算法名称。 |
2068
2069### init
2070
2071init(priKey : PriKey, callback : AsyncCallback\<void>) : void
2072
2073使用私钥初始化Sign对象,Callback形式,Sign类暂不支持重复init
2074
2075**系统能力:** SystemCapability.Security.CryptoFramework
2076
2077**参数:**
2078
2079| 参数名   | 类型                 | 必填 | 说明             |
2080| -------- | -------------------- | ---- | ---------------- |
2081| priKey   | [PriKey](#prikey)    | 是   | 用于Sign的初始化 |
2082| callback | AsyncCallback\<void> | 是   | 回调函数       |
2083
2084**错误码:**
2085
2086| 错误码ID | 错误信息               |
2087| -------- | ---------------------- |
2088| 17620001 | memory error.          |
2089| 17620002 | runtime error.          |
2090| 17630001 | crypto operation error. |
2091
2092### init
2093
2094init(priKey : PriKey) : Promise\<void>
2095
2096使用私钥初始化Sign对象,Promise形式,Sign类暂不支持重复init
2097
2098**系统能力:** SystemCapability.Security.CryptoFramework
2099
2100**参数:**
2101
2102| 参数名 | 类型 | 必填 | 说明             |
2103| ------ | ---- | ---- | ---------------- |
2104| priKey | [PriKey](#prikey)  | 是   | 用于Sign的初始化 |
2105
2106**返回值:**
2107
2108| 类型           | 说明        |
2109| -------------- | ----------- |
2110| Promise\<void> | Promise对象 |
2111
2112**错误码:**
2113
2114| 错误码ID | 错误信息               |
2115| -------- | ---------------------- |
2116| 17620001 | memory error.          |
2117| 17620002 | runtime error.          |
2118| 17630001 | crypto operation error. |
2119
2120### update
2121
2122update(data : DataBlob, callback : AsyncCallback\<void>) : void
2123
2124追加待签名数据,callback方式
2125
2126> **说明:**
2127> Sign多次调用update的代码示例详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
2128
2129**系统能力:** SystemCapability.Security.CryptoFramework
2130
2131**参数:**
2132
2133| 参数名   | 类型                 | 必填 | 说明       |
2134| -------- | -------------------- | ---- | ---------- |
2135| data     | [DataBlob](#datablob)| 是   | 传入的消息 |
2136| callback | AsyncCallback\<void> | 是   | 回调函数   |
2137
2138**错误码:**
2139
2140| 错误码ID | 错误信息               |
2141| -------- | ---------------------- |
2142| 17620001 | memory error.          |
2143| 17620002 | runtime error.          |
2144| 17630001 | crypto operation error. |
2145
2146### update
2147
2148update(data : DataBlob) : Promise\<void>;
2149
2150追加待签名数据,promise方式
2151
2152> **说明:**
2153> Sign多次调用update的代码示例详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
2154
2155**系统能力:** SystemCapability.Security.CryptoFramework
2156
2157**参数:**
2158
2159| 参数名 | 类型     | 必填 | 说明       |
2160| ------ | -------- | ---- | ---------- |
2161| data   | [DataBlob](#datablob)  | 是   | 传入的消息 |
2162
2163**返回值:**
2164
2165| 类型           | 说明        |
2166| -------------- | ----------- |
2167| Promise\<void> | Promise对象 |
2168
2169**错误码:**
2170
2171| 错误码ID | 错误信息               |
2172| -------- | ---------------------- |
2173| 17620001 | memory error.          |
2174| 17620002 | runtime error.          |
2175| 17630001 | crypto operation error. |
2176
2177### sign
2178
2179sign(data : DataBlob, callback : AsyncCallback\<DataBlob>) : void
2180
2181对数据进行签名,返回签名结果,callback方式
2182
2183**系统能力:** SystemCapability.Security.CryptoFramework
2184
2185**参数:**
2186
2187| 参数名   | 类型                 | 必填 | 说明       |
2188| -------- | -------------------- | ---- | ---------- |
2189| data     | [DataBlob](#datablob)              | 是   | 传入的消息 |
2190| callback | AsyncCallback\<[DataBlob](#datablob) > | 是   | 回调函数   |
2191
2192**错误码:**
2193
2194| 错误码ID | 错误信息               |
2195| -------- | ---------------------- |
2196| 17620001 | memory error.          |
2197| 17620002 | runtime error.          |
2198| 17630001 | crypto operation error. |
2199
2200### sign
2201
2202sign(data : DataBlob) : Promise\<DataBlob>
2203
2204对数据进行签名,返回签名结果,promise方式
2205
2206**系统能力:** SystemCapability.Security.CryptoFramework
2207
2208**参数:**
2209
2210| 参数名 | 类型     | 必填 | 说明       |
2211| ------ | -------- | ---- | ---------- |
2212| data   | [DataBlob](#datablob)  | 是   | 传入的消息 |
2213
2214**返回值:**
2215
2216| 类型           | 说明        |
2217| -------------- | ----------- |
2218| Promise\<void> | Promise对象 |
2219
2220**错误码:**
2221
2222| 错误码ID | 错误信息               |
2223| -------- | ---------------------- |
2224| 17620001 | memory error.          |
2225| 17620002 | runtime error.          |
2226| 17630001 | crypto operation error. |
2227
2228**callback示例:**
2229
2230```javascript
2231import cryptoFramework from "@ohos.security.cryptoFramework"
2232
2233function stringToUint8Array(str) {
2234  var arr = [];
2235  for (var i = 0, j = str.length; i < j; ++i) {
2236    arr.push(str.charCodeAt(i));
2237  }
2238  var tmpArray = new Uint8Array(arr);
2239  return tmpArray;
2240}
2241
2242let globalKeyPair;
2243let SignMessageBlob;
2244let plan1 = "This is Sign test plan1"; // The first segment of data.
2245let plan2 = "This is Sign test plan2"; // The second segment of fata.
2246let input1 = { data : stringToUint8Array(plan1) };
2247let input2 = { data : stringToUint8Array(plan2) };
2248
2249function signMessageCallback() {
2250  let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
2251  let signer = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
2252  rsaGenerator.generateKeyPair(function (err, keyPair) {
2253    globalKeyPair = keyPair;
2254    let priKey = globalKeyPair.priKey;
2255    signer.init(priKey, function (err, data) {
2256      signer.update(input1, function (err, data) { // add first segment of data
2257        signer.sign(input2, function (err, data) { // add second segment of data, sign input1 and input2
2258          SignMessageBlob = data;
2259          AlertDialog.show({message : "res" +  SignMessageBlob.data});
2260        });
2261      });
2262    });
2263  });
2264}
2265```
2266
2267**promise示例:**
2268
2269```javascript
2270import cryptoFramework from "@ohos.security.cryptoFramework"
2271
2272function stringToUint8Array(str) {
2273  var arr = [];
2274  for (var i = 0, j = str.length; i < j; ++i) {
2275    arr.push(str.charCodeAt(i));
2276  }
2277  var tmpArray = new Uint8Array(arr);
2278  return tmpArray;
2279}
2280
2281let globalKeyPair;
2282let SignMessageBlob;
2283let plan1 = "This is Sign test plan1"; // The first segment of data.
2284let plan2 = "This is Sign test plan2"; // The second segment of fata.
2285let input1 = { data : stringToUint8Array(plan1) };
2286let input2 = { data : stringToUint8Array(plan2) };
2287
2288function signMessagePromise() {
2289  let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
2290  let signer = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
2291  let keyGenPromise = rsaGenerator.generateKeyPair();
2292  keyGenPromise.then( keyPair => {
2293    globalKeyPair = keyPair;
2294    let priKey = globalKeyPair.priKey;
2295    return signer.init(priKey);
2296  }).then(() => {
2297    return signer.update(input1); // add first segment of data
2298  }).then(() => {
2299    return signer.sign(input2); // add second segment of data, sign input1 and input2
2300  }).then(dataBlob => {
2301    SignMessageBlob = dataBlob;
2302    console.info("sign output is " + SignMessageBlob.data);
2303    AlertDialog.show({message : "output" +  SignMessageBlob.data});
2304  });
2305}
2306```
2307
2308## cryptoFramework.createVerify
2309
2310createVerify(algName : string) : Verify
2311
2312Verify实例生成。<br/>支持的规格详见框架概述“[签名验签规格](../../security/cryptoFramework-overview.md#签名验签规格)”一节。
2313
2314**系统能力:** SystemCapability.Security.CryptoFramework
2315
2316**参数:**
2317
2318| 参数名  | 类型   | 必填 | 说明                                                         |
2319| ------- | ------ | ---- | ------------------------------------------------------------ |
2320| algName | string | 是   | 指定签名算法:RSA或ECC,使用RSA PKCS1模式时需要设置摘要,使用RSA PSS模式时需要设置摘要和掩码摘要 |
2321
2322**返回值**:
2323
2324| 类型   | 说明                               |
2325| ------ | ---------------------------------- |
2326| Verify | 返回由输入算法指定生成的Verify对象 |
2327
2328**示例:**
2329
2330```javascript
2331import cryptoFramework from "@ohos.security.cryptoFramework"
2332
2333let verifyer1 = cryptoFramework.createVerify("RSA1024|PKCS1|SHA256");
2334
2335let verifyer2 = cryptoFramework.createVerify("RSA1024|PSS|SHA256|MGF1_SHA256")
2336```
2337
2338## Verify
2339
2340Verify类,使用Verify方法之前需要创建该类的实例进行操作,通过createVerify(algName : string) : Verify方法构造此实例。
2341
2342Verify类不支持重复初始化,当业务方需要使用新密钥验签时,需要重新创建新Verify对象并调用init初始化。
2343
2344业务方使用时,在createVerify时确定验签的模式,调用init接口设置密钥。
2345
2346当签名数据较短时,可在init初始化后直接调用verify接口传入签名数据和原文进行验签。
2347
2348当签名数据较长时,可通过update接口分段传入签名数据,最后调用verify接口对整体签名数据进行验签。
2349
2350当使用update分段传入签名数据时,verify接口的签名数据支持传null,业务方可在循环中调用update接口,循环结束后调用verify传入原文进行验签。
2351
2352### 属性
2353
2354**系统能力:** SystemCapability.Security.CryptoFramework
2355
2356| 名称    | 类型   | 可读 | 可写 | 说明                         |
2357| ------- | ------ | ---- | ---- | ---------------------------- |
2358| algName | string | 是   | 否   | 验签指定的算法名称。 |
2359
2360
2361
2362### init
2363
2364init(pubKey : PubKey, callback : AsyncCallback\<void>) : void
2365
2366传入公钥初始化Verify对象,Callback形式
2367
2368**系统能力:** SystemCapability.Security.CryptoFramework
2369
2370**参数:**
2371
2372| 参数名   | 类型                 | 必填 | 说明                         |
2373| -------- | -------------------- | ---- | ---------------------------- |
2374| pubKey   | [PubKey](#pubkey)    | 是   | 公钥对象,用于Verify的初始化 |
2375| callback | AsyncCallback\<void> | 是   | 回调函数                     |
2376
2377**错误码:**
2378
2379| 错误码ID | 错误信息               |
2380| -------- | ---------------------- |
2381| 17620001 | memory error.          |
2382| 17620002 | runtime error.          |
2383| 17630001 | crypto operation error. |
2384
2385### init
2386
2387init(pubKey : PubKey) : Promise\<void>
2388
2389传入公钥初始化Verify对象,Promise形式
2390
2391**系统能力:** SystemCapability.Security.CryptoFramework
2392
2393**参数:**
2394
2395| 参数名 | 类型 | 必填 | 说明                         |
2396| ------ | ---- | ---- | ---------------------------- |
2397| pubKey | [PubKey](#pubkey)  | 是   | 公钥对象,用于Verify的初始化 |
2398
2399**返回值:**
2400
2401| 类型           | 说明        |
2402| -------------- | ----------- |
2403| Promise\<void> | Promise对象 |
2404
2405**错误码:**
2406
2407| 错误码ID | 错误信息               |
2408| -------- | ---------------------- |
2409| 17620001 | memory error.          |
2410| 17620002 | runtime error.          |
2411| 17630001 | crypto operation error. |
2412
2413### update
2414
2415update(data : DataBlob, callback : AsyncCallback\<void>) : void
2416
2417追加待验签数据,callback方式
2418
2419> **说明:**
2420> Verify多次调用update的代码示例详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
2421
2422**系统能力:** SystemCapability.Security.CryptoFramework
2423
2424**参数:**
2425
2426| 参数名   | 类型                 | 必填 | 说明       |
2427| -------- | -------------------- | ---- | ---------- |
2428| data     | [DataBlob](#datablob)| 是   | 传入的消息 |
2429| callback | AsyncCallback\<void> | 是   | 回调函数   |
2430
2431**错误码:**
2432
2433| 错误码ID | 错误信息               |
2434| -------- | ---------------------- |
2435| 17620001 | memory error.          |
2436| 17620002 | runtime error.          |
2437| 17630001 | crypto operation error. |
2438
2439### update
2440
2441update(data : DataBlob) : Promise\<void>;
2442
2443追加待验签数据,promise方式
2444
2445> **说明:**
2446> Verify多次调用update的代码示例详见开发指导“[使用签名验签操作](../../security/cryptoFramework-guidelines.md#使用签名验签操作)”。
2447
2448**系统能力:** SystemCapability.Security.CryptoFramework
2449
2450**参数:**
2451
2452| 参数名 | 类型     | 必填 | 说明       |
2453| ------ | -------- | ---- | ---------- |
2454| data   | [DataBlob](#datablob)  | 是   | 传入的消息 |
2455
2456**返回值:**
2457
2458| 类型           | 说明        |
2459| -------------- | ----------- |
2460| Promise\<void> | Promise对象 |
2461
2462**错误码:**
2463
2464| 错误码ID | 错误信息               |
2465| -------- | ---------------------- |
2466| 17620001 | memory error.          |
2467| 17620002 | runtime error.          |
2468| 17630001 | crypto operation error. |
2469
2470### verify
2471
2472verify(data : DataBlob, signatureData : DataBlob, callback : AsyncCallback\<boolean>) : void
2473
2474对数据进行验签,返回验签结果,callback方式
2475
2476**系统能力:** SystemCapability.Security.CryptoFramework
2477
2478**参数:**
2479
2480| 参数名        | 类型                 | 必填 | 说明       |
2481| ------------- | -------------------- | ---- | ---------- |
2482| data          | [DataBlob](#datablob)              | 是   | 传入的消息 |
2483| signatureData | [DataBlob](#datablob)              | 是   | 签名数据   |
2484| callback      | AsyncCallback\<boolean> | 是   | 回调函数   |
2485
2486**错误码:**
2487
2488| 错误码ID | 错误信息               |
2489| -------- | ---------------------- |
2490| 17620001 | memory error.          |
2491| 17620002 | runtime error.          |
2492| 17630001 | crypto operation error. |
2493
2494### verify
2495
2496verify(data : DataBlob, signatureData : DataBlob) : Promise\<boolean>
2497
2498对数据进行验签,返回验签结果,promise方式
2499
2500**系统能力:** SystemCapability.Security.CryptoFramework
2501
2502**参数:**
2503
2504| 参数名        | 类型     | 必填 | 说明       |
2505| ------------- | -------- | ---- | ---------- |
2506| data          | [DataBlob](#datablob)  | 是   | 传入的消息 |
2507| signatureData | [DataBlob](#datablob)  | 是   | 签名数据   |
2508
2509**返回值:**
2510
2511| 类型              | 说明                         |
2512| ----------------- | ---------------------------- |
2513| Promise\<boolean> | 异步返回值,代表验签是否通过 |
2514
2515**错误码:**
2516
2517| 错误码ID | 错误信息               |
2518| -------- | ---------------------- |
2519| 17620001 | memory error.          |
2520| 17620002 | runtime error.          |
2521| 17630001 | crypto operation error. |
2522
2523**callback示例:**
2524
2525```javascript
2526import cryptoFramework from "@ohos.security.cryptoFramework"
2527
2528let globalKeyPair; // globalKeyPair为使用非对称密钥生成器生成的非对称密钥对象,此处省略生成过程
2529let input1 = null;
2530let input2 = null;
2531let signMessageBlob = null; // 签名后的数据,此处省略
2532let verifyer = cryptoFramework.createVerify("RSA1024|PKCS1|SHA25");
2533verifyer.init(globalKeyPair.pubKey, function (err, data) {
2534  verifyer.update(input1, function(err, data) {
2535    verifyer.verify(input2, signMessageBlob, function(err, data) {
2536      console.info("verify result is " + data);
2537    })
2538  });
2539})
2540```
2541
2542**promise示例:**
2543
2544```javascript
2545import cryptoFramework from "@ohos.security.cryptoFramework"
2546
2547let globalKeyPair; // globalKeyPair为使用非对称密钥生成器生成的非对称密钥对象,此处省略生成过程
2548let verifyer = cryptoFramework.createVerify("RSA1024|PKCS1|SHA256");
2549let verifyInitPromise = verifyer.init(globalKeyPair.pubKey);
2550let input1 = null;
2551let input2 = null;
2552let signMessageBlob = null; // 签名后的数据,此处省略
2553verifyInitPromise.then(() => {
2554  return verifyer.update(input1);
2555}).then(() => {
2556  return verifyer.verify(input2, signMessageBlob);
2557}).then(res => {
2558  console.log("Verify result is " + res);
2559});
2560```
2561
2562## cryptoFramework.createKeyAgreement
2563
2564createKeyAgreement(algName : string) : KeyAgreement
2565
2566KeyAgreement实例生成。<br/>支持的规格详见框架概述“[密钥协商规格](../../security/cryptoFramework-overview.md#密钥协商规格)”一节。
2567
2568**系统能力:** SystemCapability.Security.CryptoFramework
2569
2570**参数:**
2571
2572| 参数名  | 类型   | 必填 | 说明                            |
2573| ------- | ------ | ---- | ------------------------------- |
2574| algName | string | 是   | 指定密钥协商算法:目前仅支持ECC |
2575
2576**返回值**:
2577
2578| 类型         | 说明                                     |
2579| ------------ | ---------------------------------------- |
2580| KeyAgreement | 返回由输入算法指定生成的KeyAgreement对象 |
2581
2582**示例:**
2583
2584```javascript
2585import cryptoFramework from "@ohos.security.cryptoFramework"
2586
2587let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");
2588
2589```
2590
2591## KeyAgreement
2592
2593KeyAgreement类,使用密钥协商方法之前需要创建该类的实例进行操作,通过createKeyAgreement(algName : string) : KeyAgreement方法构造此实例。
2594
2595### 属性
2596
2597**系统能力:** SystemCapability.Security.CryptoFramework
2598
2599| 名称    | 类型   | 可读 | 可写 | 说明                         |
2600| ------- | ------ | ---- | ---- | ---------------------------- |
2601| algName | string | 是   | 否   | 密钥协商指定的算法名称。 |
2602
2603### generateSecret
2604
2605generateSecret(priKey : PriKey, pubKey : PubKey, callback : AsyncCallback\<DataBlob>) : void
2606
2607基于传入的私钥与公钥进行密钥协商,返回共享秘密,Callback形式
2608
2609**系统能力:** SystemCapability.Security.CryptoFramework
2610
2611**参数:**
2612
2613| 参数名   | 类型                     | 必填 | 说明                   |
2614| -------- | ------------------------ | ---- | ---------------------- |
2615| priKey   | [PriKey](#prikey)        | 是   | 设置密钥协商的私钥输入 |
2616| pubKey   | [PubKey](#pubkey)        | 是   | 设置密钥协商的公钥输入 |
2617| callback | AsyncCallback\<[DataBlob](#datablob)> | 是   | 异步接受共享秘密的回调 |
2618
2619**错误码:**
2620
2621| 错误码ID | 错误信息               |
2622| -------- | ---------------------- |
2623| 17620001 | memory error.          |
2624| 17620002 | runtime error.          |
2625| 17630001 | crypto operation error. |
2626
2627### generateSecret
2628
2629generateSecret(priKey : PriKey, pubKey : PubKey) : Promise\<DataBlob>
2630
2631基于传入的私钥与公钥进行密钥协商,返回共享秘密,Promise形式
2632
2633**系统能力:** SystemCapability.Security.CryptoFramework
2634
2635**参数:**
2636
2637| 参数名 | 类型   | 必填 | 说明                   |
2638| ------ | ------ | ---- | ---------------------- |
2639| priKey | [PriKey](#prikey) | 是   | 设置密钥协商的私钥输入 |
2640| pubKey | [PubKey](#pubkey) | 是   | 设置密钥协商的公钥输入 |
2641
2642**返回值:**
2643
2644| 类型               | 说明     |
2645| ------------------ | -------- |
2646| Promise\<[DataBlob](#datablob)> | 共享秘密 |
2647
2648**错误码:**
2649
2650| 错误码ID | 错误信息               |
2651| -------- | ---------------------- |
2652| 17620001 | memory error.          |
2653| 17620002 | runtime error.          |
2654| 17630001 | crypto operation error. |
2655
2656**callback示例:**
2657
2658```javascript
2659import cryptoFramework from "@ohos.security.cryptoFramework"
2660
2661let globalKeyPair; // globalKeyPair为使用非对称密钥生成器生成的非对称密钥对象,此处省略生成过程
2662let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");
2663keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey, function (err, secret) {
2664  if (err) {
2665    console.error("keyAgreement error.");
2666    return;
2667  }
2668  console.info("keyAgreement output is " + secret.data);
2669});
2670```
2671
2672**promise示例:**
2673
2674```javascript
2675import cryptoFramework from "@ohos.security.cryptoFramework"
2676
2677let globalKeyPair; // globalKeyPair为使用非对称密钥生成器生成的非对称密钥对象,此处省略生成过程
2678let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");
2679let keyAgreementPromise = keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey);
2680keyAgreementPromise.then((secret) => {
2681  console.info("keyAgreement output is " + secret.data);
2682}).catch((error) => {
2683  console.error("keyAgreement error.");
2684});
2685```
2686