1/**
2 * @file hi_cipher.h
3 *
4 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/**
19 * @defgroup iot_cipher Encryption and Decryption.
20 * @ingroup drivers
21 */
22#ifndef __HI_CIPHER_H__
23#define __HI_CIPHER_H__
24
25#include <hi_types.h>
26
27#ifdef __cplusplus
28#if __cplusplus
29extern "C" {
30#endif
31#endif  /* __cplusplus */
32
33#define PKE_LEN_32_BYTES             32
34#define PKE_LEN_256_BYTES            256
35#define PKE_LEN_384_BYTES            384
36#define PKE_LEN_512_BYTES            512
37#define RSA_KEY_LEN_2048             256
38#define AES_MAX_KEY_IN_WORD          16
39#define AES_IV_LEN_IN_WORD           4
40#define KDF_KEY_LEN_IN_BYTES         32
41
42/**
43* @ingroup iot_cipher
44* Hash algrithm type
45*/
46typedef enum {
47    HI_CIPHER_HASH_TYPE_SHA256       = 0x0,
48    HI_CIPHER_HASH_TYPE_HMAC_SHA256,
49    HI_CIPHER_HASH_TYPE_MAX,
50    HI_CIPHER_HASH_TYPE_INVALID      = 0xffffffff,
51}hi_cipher_hash_type;
52
53/**
54* @ingroup iot_cipher
55* Rsa sign and veriry scheme
56*/
57typedef enum {
58    HI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_V15_SHA256 = 0x00,  /**< PKCS#1 RSASSA_PKCS1_V15_SHA256 signature */
59    HI_CIPHER_RSA_SIGN_SCHEME_RSASSA_PKCS1_PSS_SHA256,         /**< PKCS#1 RSASSA_PKCS1_PSS_SHA256 signature */
60    HI_CIPHER_RSA_SIGN_SCHEME_MAX,
61    HI_CIPHER_RSA_SIGN_SCHEME_INVALID = 0xffffffff,
62}hi_cipher_rsa_sign_scheme;
63
64/**
65* @ingroup iot_cipher
66* Aes key from
67*/
68typedef enum {
69    HI_CIPHER_AES_KEY_FROM_CPU  = 0x00,
70    HI_CIPHER_AES_KEY_FROM_KDF,
71    HI_CIPHER_AES_KEY_FROM_MAX,
72    HI_CIPHER_AES_KEY_FROM_INVALID = 0xffffffff,
73}hi_cipher_aes_key_from;
74
75/**
76* @ingroup iot_cipher
77* Aes work mode
78*/
79typedef enum {
80    HI_CIPHER_AES_WORK_MODE_ECB  = 0x00,    /**< Electronic codebook (ECB) mode, ECB has been considered insecure and
81                                               it is recommended not to use it. */
82    HI_CIPHER_AES_WORK_MODE_CBC,            /**< Cipher block chaining (CBC) mode. */
83    HI_CIPHER_AES_WORK_MODE_CTR,            /**< Counter (CTR) mode. */
84    HI_CIPHER_AES_WORK_MODE_CCM,            /**< Counter (CCM) mode. */
85    HI_CIPHER_AES_WORK_MODE_XTS,            /**< XTS-AES (XTS) mode. */
86    HI_CIPHER_AES_WORK_MODE_MAX,
87    HI_CIPHER_AES_WORK_MODE_INVALID = 0xffffffff,
88}hi_cipher_aes_work_mode;
89
90/**
91* @ingroup iot_cipher
92* Aes key length
93*/
94typedef enum {
95    HI_CIPHER_AES_KEY_LENGTH_128BIT  = 0x00,
96    HI_CIPHER_AES_KEY_LENGTH_192BIT,
97    HI_CIPHER_AES_KEY_LENGTH_256BIT,
98    HI_CIPHER_AES_KEY_LENGTH_512BIT,             /**< 512bit, just used for xts. */
99    HI_CIPHER_AES_KEY_LENGTH_MAX,
100    HI_CIPHER_AES_KEY_LENGTH_INVALID = 0xffffffff,
101}hi_cipher_aes_key_length;
102
103/**
104* @ingroup iot_cipher
105* Rsa private key sign
106*/
107typedef struct {
108    hi_cipher_rsa_sign_scheme scheme;  /**< The rsa sign type */
109    hi_u8 *d;                          /**< The private exponent */
110    hi_u8 *n;                          /**< The modulus */
111    hi_u32 klen;                       /**< The key length */
112} hi_cipher_rsa_sign;
113
114/**
115* @ingroup iot_cipher
116* Rsa public key verify
117*/
118typedef struct {
119    hi_cipher_rsa_sign_scheme scheme;  /**< The rsa sign type */
120    hi_u8 *e;                          /**< The public exponent */
121    hi_u8 *n;                          /**< The modulus */
122    hi_u32 klen;                       /**< The key length */
123} hi_cipher_rsa_verify;
124
125/**
126* @ingroup iot_cipher
127* cipher struct for output
128*/
129typedef struct {
130    hi_u8 *out;                        /**< Point for output */
131    hi_u32 out_buf_len;                /**< Length of output buffer */
132    hi_u32 *out_len;                   /**< Length of valid output data */
133} hi_cipher_output;
134
135/**
136* @ingroup iot_cipher
137* Struct of ecc curves parameters
138*/
139typedef struct {
140    const hi_u8 *p;   /**< Finite field: equal to p in case of prime field curves or equal to 2^n in case of binary
141                         field curves. */
142    const hi_u8 *a;   /**< Curve parameter a (q-3 in Suite B). */
143    const hi_u8 *b;   /**< Curve parameter b. */
144    const hi_u8 *gx;  /**< X coordinates of G which is a base point on the curve. */
145    const hi_u8 *gy;  /**< Y coordinates of G which is a base point on the curve. */
146    const hi_u8 *n;   /**< Prime which is the order of G point. */
147    hi_u32 h;         /**< Cofactor, which is the order of the elliptic curve divided by the order of the point G. For
148                         the Suite B curves, h = 1. */
149    hi_u32 ksize;   /**< Ecc key size in bytes. It corresponds to the size in bytes of the prime, should be 32bytes. */
150}hi_cipher_ecc_param;
151
152/**
153* @ingroup iot_cipher
154* Struct of ecc sign
155*/
156typedef struct {
157    const hi_u8 *d;  /**< Ecdh private key, the caller ensures it is padded with leading zeros if the effective size of
158                          this key is smaller than ecc key size. */
159    const hi_u8 *hash; /**< Hash data for ecc sign. */
160    hi_u32 hash_len;   /**< The length of hash data, just 32 bytes is valid data. */
161    hi_u8 *r;          /**< Output ecc sign result R, its length is ecc key size. */
162    hi_u8 *s;          /**< Output ecc sign result S, its length is ecc key size. */
163}hi_cipher_ecc_sign;
164
165/**
166* @ingroup iot_cipher
167* Struct of ecc verify
168*/
169typedef struct {
170    const hi_u8 *px;  /**< Ecdh X coordinates of the generated public key, the caller ensures it is padded with leading
171                         zeros if the effective size of this key is smaller than ecc key size. */
172    const hi_u8 *py;  /**< Ecdh Y coordinates of the generated public key, the caller ensures it is padded with leading
173                         zeros if the effective size of this key is smaller than ecc key size. */
174    const hi_u8 *hash; /**< Hash data for ecc verify. */
175    hi_u32 hash_len;   /**< The length of hash data, just 32 bytes is valid data. */
176    const hi_u8 *r;    /**< Output ecc sign result R, its length is ecc key size. */
177    const hi_u8 *s;    /**< Output ecc sign result S, its length is ecc key size. */
178}hi_cipher_ecc_verify;
179
180/**
181* @ingroup iot_cipher
182* Aes ccm struct
183*/
184typedef struct {
185    hi_u8 *n;            /**< Nonce. */
186    hi_u32 n_len;        /**< Nonce length for CCM, which is an element of {7,8,9,10,11,12,13}. */
187    hi_u32 tag_len;      /**< Tag lenght for CCM which is an element of {4,6,8,10,12,14,16}. */
188    hi_u32 aad_len;      /**< Associated data length for CCM. */
189    uintptr_t aad_addr;  /**< Physical address of Associated data for CCM. */
190}hi_cipher_aes_ccm;
191
192/**
193* @ingroup iot_cipher
194* Aes ctrl struct
195*/
196typedef struct {
197    hi_u32 key[AES_MAX_KEY_IN_WORD];    /**< Key input. */
198    hi_u32 iv[AES_IV_LEN_IN_WORD];      /**< Initialization vector (IV). */
199    hi_bool random_en;                  /**< Enable random delay or not. */
200    hi_u8 resv[3];                      /* 3 byte reserved */
201    hi_cipher_aes_key_from key_from;    /**< Key from, When using kdf key, no nead to configure the input key. */
202    hi_cipher_aes_work_mode work_mode;  /**< Work mode. */
203    hi_cipher_aes_key_length key_len;   /**< Key length. aes-ecb/cbc/ctr support 128/192/256 bits key, ccm just support
204                                            128 bits key, xts just support 256/512 bits key. */
205    hi_cipher_aes_ccm *ccm;             /**< Struct for ccm. */
206}hi_cipher_aes_ctrl;
207
208/**
209* @ingroup iot_cipher
210* Kdf key type
211*/
212typedef enum {
213    HI_CIPHER_SSS_KDF_KEY_DEVICE  = 0x0, /**< kdf device key derivation. */
214    HI_CIPHER_SSS_KDF_KEY_STORAGE,       /**< kdf storage key derivation. */
215    HI_CIPHER_SSS_KDF_KEY_MAX,
216    HI_CIPHER_SSS_KDF_KEY_INVALID = 0xFFFFFFFF,
217}hi_cipher_kdf_mode;
218
219/**
220* @ingroup iot_cipher
221* Kdf ctrl struct
222*/
223typedef struct {
224    const hi_u8 *salt;                   /**< salt for kdf key derivation. */
225    hi_u32 salt_len;                     /**< salt_len should be 16 bytes for kdf device key derivation,
226                                            32 bytes for kdf storage key derivation. */
227    hi_u8 key[KDF_KEY_LEN_IN_BYTES];
228    hi_cipher_kdf_mode kdf_mode;         /**< kdf mode for key derivation. */
229    hi_u32 kdf_cnt;                      /**< kdf cnt for iteration.It is recommended that the number of iterations be
230        not less than 10000 times, if performance requirement, no less than 1000
231        times,  and not more than 0xffff times. */
232    hi_u8 result[KDF_KEY_LEN_IN_BYTES];
233}hi_cipher_kdf_ctrl;
234
235/**
236* @ingroup iot_cipher
237* Hash/hmac init struct input
238*/
239typedef struct {
240    const hi_u8 *hmac_key;               /**< hmac_key, just used for hmac. */
241    hi_u32 hmac_key_len;                 /**< hmac_key_len, just used for hmac. */
242    hi_cipher_hash_type sha_type;        /**< sha_type, hash or hmac type. */
243}hi_cipher_hash_atts;
244
245/**
246* @ingroup        iot_cipher
247* @brief          Initializes the Cipher module. CNcomment:Cipher 模块初始化。CNend
248*
249* @par 描述:
250*                 Initializes the Cipher module, does NOT support multi-tasks.
251CNcomment:Cipher模块初始化,不支持多任务。CNend
252*
253* @attention      This function must be called before using cipher module.
254CNcomment:使用Cipher模块算法前调用本接口初始化。CNend
255* @param          None
256*
257* @retval         #0          Success
258* @retval         #Other      Failure, for details, see file hi_errno.h.
259* @par 依赖:
260*                 @li hi_cipher.h:Describes Cipher module APIs.
261CNcomment:文件用于描述Cipher模块相关接口。CNend
262* @see            hi_cipher_init。
263*/
264hi_u32 hi_cipher_init(hi_void);
265
266/**
267* @ingroup        iot_cipher
268* @brief          Settings of AES. CNcomment:AES算法参数配置。CNend
269*
270* @par 描述:
271*                 Configure of AES. CNcomment:AES算法参数配置。CNend
272*
273* @attention      None
274* @param          ctrl        [IN]  type #hi_cipher_aes_ctrl *,AES parameters. CNcomment:AES算法参数配置。CNend
275*
276* @retval         #0          Success
277* @retval         #Other      Failure, for details, see file hi_errno.h.
278* @par 依赖:
279*                 @li hi_cipher.h:Describes Cipher module APIs.
280CNcomment:文件用于描述Cipher模块相关接口。CNend
281* @see            hi_cipher_aes_config。
282*/
283hi_u32 hi_cipher_aes_config(hi_cipher_aes_ctrl *ctrl);
284
285/**
286* @ingroup        iot_cipher
287* @brief          Encryption/Decryption of AES, if execution fails, hi_cipher_aes_destroy_config must be called to
288release resources.
289CNcomment:AES算法加解密,如果执行失败,必须调用hi_cipher_aes_destroy_config接口释放资源。CNend
290*
291* @par 描述:
292*                 Encryption/Decryption of AES. CNcomment:AES算法加解密。CNend
293*
294* @attention      无。
295* @param          src_addr    [IN]  type #uintptr_t,Input data source address.
296CNcomment:待加密或解密的源数据物理地址,地址要求4对齐。CNend
297* @param          dest_addr   [OUT] type #uintptr_t,output data physical address, the address must be
298aligned in 4 bytes.
299CNcomment:加密或解密结果数据物理地址,地址要求4对齐。CNend
300* @param          length      [IN]  type #hi_u32,data length, ECB/CBC/CTR must be aligned in 16 bytes,
301CCM doesn't need to.
302CNcomment:数据长度, ECB/CBC/CTR要求16bytes对齐, CCM可以不要求16bytes对齐。CNend
303* @param          encrypt     [IN]  type #hi_bool,options of encryption/decryption, HI_TRUE is for encryption,
304HI_FALSE is for decryption.CNcomment:加解密配置选项,配置HI_TRUE为加密,配置HI_FALSE为解密。CNend
305*
306* @retval         #0          Success
307* @retval         #Other      Failure, for details, see file hi_errno.h.
308* @par 依赖:
309*                 @li hi_cipher.h:Describes Cipher module APIs.
310CNcomment:文件用于描述Cipher模块相关接口。CNend
311* @see            hi_cipher_aes_crypto。
312*/
313hi_u32 hi_cipher_aes_crypto(uintptr_t src_addr, uintptr_t dest_addr, hi_u32 length, hi_bool encrypt);
314
315/**
316* @ingroup        iot_cipher
317* @brief          Output Tag, if execution fails, hi_cipher_aes_destroy_config must be called to release resources.
318CNcomment:输出Tag,如果执行失败,必须调用hi_cipher_aes_destroy_config接口释放资源。CNend
319*
320* @par 描述:
321*                 Output Tag, AES and CCM will output Tag after encrypting or decrypting.
322CNcomment:输出Tag, AES CCM 模式加密或解密计算完成后,输出Tag值。CNend
323*
324* @attention      None
325* @param          tag         [OUT] type #hi_u8 *,Pointer to output Tag. CNcomment:输出Tag指针。CNend
326* @param          tag_buf_len [IN]  type #hi_u32,Length of the buffer which tag points to.
327CNcomment:tag指针指向的输出buff长度。CNend
328* @param          tag_len     [OUT] type #hi_u32*,Length of the output tag.
329CNcomment: 输出的tag数据长度。CNend.
330*
331* @retval         #0          Success
332* @retval         #Other      Failure, for details, see file hi_errno.h.
333* @par 依赖:
334*                 @li hi_cipher.h:Describes Cipher module APIs.
335CNcomment:文件用于描述Cipher模块相关接口。CNend
336* @see            hi_cipher_aes_get_tag。
337*/
338hi_u32 hi_cipher_aes_get_tag(hi_u8 *tag, hi_u32 tag_buf_len, hi_u32 *tag_len);
339
340/**
341* @ingroup        iot_cipher
342* @brief          Destory AES configures. CNcomment:AES算法销毁配置的参数CNend
343*
344* @par 描述:
345*                 Destory AES configures. CNcomment:AES算法销毁配置的参数CNend
346*
347* @attention      In pair with hi_cipher_aes_config.CNcomment:与参数配置成对使用CNend
348* @param          None
349
350* @retval         #0          Success
351* @retval         #Other      Failure, for details, see file hi_errno.h.
352* @par 依赖:
353*                 @li hi_cipher.h:Describes Cipher module APIs.
354CNcomment:文件用于描述Cipher模块相关接口。CNend
355* @see            hi_cipher_aes_destroy_config。
356*/
357hi_u32 hi_cipher_aes_destroy_config(hi_void);
358
359/**
360* @ingroup        iot_cipher
361* @brief          Settings of HASH/HMAC, if execution success, hi_cipher_hash_final must be called to release
362resources.CNcomment:HASH/HMAC算法参数配置,执行成功后必须调用hi_cipher_hash_final接口释放资源。CNend
363*
364* @par 描述:
365*                 Settings of HASH/HMAC, this function should be called before calculating.
366CNcomment:HASH/HMAC算法参数配置,HASH/HMAC计算前调用
367*
368* @attention      None
369* @param  atts    [IN]        type #const hi_cipher_hash_atts *,HASH attribute.CNcomment:HASH算法类型配置。CNend
370
371* @retval         #0          Success
372* @retval         #Other      Failure, for details, see file hi_errno.h.
373* @par 依赖:
374*                 @li hi_cipher.h:Describes Cipher module APIs.
375CNcomment:文件用于描述Cipher模块相关接口。CNend
376* @see            hi_cipher_hash_start。
377*/
378hi_u32 hi_cipher_hash_start(const hi_cipher_hash_atts *atts);
379
380/**
381* @ingroup        iot_cipher
382* @brief          Calculating by HASH/HMAC, if execution success, hi_cipher_hash_final must be called to release
383resources.CNcomment:HASH/HMAC计算,执行成功后必须调用hi_cipher_hash_final接口释放资源。CNend
384*
385* @par 描述:
386*                 Hash calculation. Multiple segments can be calculated. HMAC calculation supports only single-segment
387calculation.CNcomment:HASH计算,支持多段计算,HMAC计算只支持单段计算。CNend
388*
389* @attention      None
390* @param          src_addr    [IN]  type #uintptr_t,Data address to be calculated by HASH.
391CNcomment:待HASH计算的数据地址。CNend
392* @param          length      [IN]  type #hi_u32,Data length to be calculated by HASH.
393CNcomment:待HASH计算的数据长度。CNend
394*
395* @retval         #0          Success
396* @retval         #Other      Failure, for details, see file hi_errno.h.
397* @par 依赖:
398*                 @li hi_cipher.h:Describes Cipher module APIs.
399CNcomment:文件用于描述Cipher模块相关接口。CNend
400* @see            hi_cipher_hash_update。
401*/
402hi_u32 hi_cipher_hash_update(uintptr_t src_addr, hi_u32 length);
403
404/**
405* @ingroup        iot_cipher
406* @brief          HASH/HMAC calculation finished.CNcomment:HASH/HMAC计算结束CNend
407*
408* @par 描述:
409*                 Ouput results after HASH/HMAC finished calculating.CNcomment:HASH/HMAC计算结束,
410输出计算结果。CNend
411*
412* @attention      None
413*
414* @param          out          [OUT]  type #hi_u8 *,Pointer to the output of the HASH/HMAC calculation result.
415CNcomment:HASH/HMAC计算结果输出指针。CNend
416* @param          out_len      [IN]   type #hi_u32,HASH/HMAC The output pointer of the calculation result points to
417*                              the space length. The output length must be greater than or equal to 32 bytes.
418CNcomment:HASH/HMAC计算结果输出指针指向空间长度,要求输出长度满足不小于32bytes。CNend
419*
420* @retval         #0          Success
421* @retval         #Other      Failure, for details, see file hi_errno.h.
422* @par 依赖:
423*                 @li hi_cipher.h:Describes Cipher module APIs.
424CNcomment:文件用于描述Cipher模块相关接口。CNend
425* @see            hi_cipher_hash_final。
426*/
427hi_u32 hi_cipher_hash_final(hi_u8 *out, hi_u32 out_len);
428
429/**
430* @ingroup        iot_cipher
431* @brief          HASH calculation.CNcomment:HASH计算CNend
432*
433* @par 描述:
434*                 Performs hash calculation on a segment of data and outputs the hash result.
435CNcomment:对一段数据做HASH计算,并输出HASH结果。CNend
436*
437* @attention      None
438*
439* @param          input        [IN]  type #uintptr_t,Enter the data address. The address must be 4-bytes-aligned.
440CNcomment:输入数据地址,地址要求4对齐。CNend
441* @param          input_len    [IN]  type #hi_u32, Input data length.CNcomment:输入数据长度。CNend
442* @param          hash         [OUT] type #hi_u8 *,Output the hash result. The length is 32 bytes.
443CNcomment:输出HASH结果, 长度为 32 bytes。CNend
444* @param          hash_len     [IN]  type #hi_u32, BUF length of the hash result. The value must be greater than or
445*                              equal to 32 bytes.CNcomment:输出HASH结果的BUF长度,需要满足不小于32bytes。CNend
446*
447* @retval         #0          Success
448* @retval         #Other      Failure, for details, see file hi_errno.h.
449* @par 依赖:
450*                 @li hi_cipher.h:Describes Cipher module APIs.
451CNcomment:文件用于描述Cipher模块相关接口。CNend
452* @see            hi_cipher_hash_sha256。
453*/
454hi_u32 hi_cipher_hash_sha256(uintptr_t input, hi_u32 input_len, hi_u8 *hash, hi_u32 hash_len);
455
456/**
457* @ingroup        iot_cipher
458* @brief          KDF calculation.CNcomment:KDF算法计算。CNend
459*
460* @par 描述:
461*                 KDF calculation.CNcomment:KDF算法计算。CNend
462*
463* @attention      None
464* @param          ctrl        [IN] type  #hi_cipher_kdf_ctrl*,Poninter to KDF algorithm parameter configuration
465                              control structure.CNcomment:KDF算法参数配置控制结构体。CNend
466*
467* @retval         #0          Success
468* @retval         #Other      Failure, for details, see file hi_errno.h.
469* @par 依赖:
470*                 @li hi_cipher.h:Describes Cipher module APIs.
471CNcomment:文件用于描述Cipher模块相关接口。CNend
472* @see            hi_cipher_kdf_key_derive。
473*/
474hi_u32 hi_cipher_kdf_key_derive(hi_cipher_kdf_ctrl *ctrl);
475
476/**
477* @ingroup        iot_cipher
478* @brief          Rsa signature.CNcomment:Rsa 签名CNend
479*
480* @par 描述:
481*                 Rsa signature and output of the signature result.CNcomment:Rsa签名,输出签名结果。CNend
482*
483* @attention      None
484* @param          rsa_sign     [IN]  type  #hi_cipher_rsa_sign *,Pointer to RSA signature structure.
485CNcomment:Rsa签名算法结构体。CNend
486* @param          hash_data    [IN]  type  #const hi_u8 *,Indicates the hash data to be signed.
487CNcomment:待签名的HASH数据。CNend
488* @param          hash_data_len [IN] type  #hi_u32, Length of the hash data to be signed, 32 bytes data.
489CNcomment:待签名的HASH数据的长度,32bytes数据。CNend
490* @param          sign         [OUT] type  #const hi_cipher_output *,Signature result output structure. The length
491*                              of the output signature result is the length of the key.
492CNcomment:签名结果输出结构体,输出的签名结果长度为key的长度。CNend
493*
494* @retval         #0          Success
495* @retval         #Other      Failure, for details, see file hi_errno.h.
496* @par 依赖:
497*                 @li hi_cipher.h:Describes Cipher module APIs.
498CNcomment:文件用于描述Cipher模块相关接口。CNend
499* @see            hi_cipher_rsa_sign_hash。
500*/
501hi_u32 hi_cipher_rsa_sign_hash(const hi_cipher_rsa_sign *rsa_sign, const hi_u8 *hash_data, hi_u32 hash_data_len,
502    const hi_cipher_output *sign);
503
504/**
505* @ingroup        iot_cipher
506* @brief          Rsa Signature Verification.CNcomment:Rsa 签名结果校验CNend
507*
508* @par 描述:
509*                 Rsa Signature Verification.CNcomment:Rsa 签名结果校验。CNend
510*
511* @attention      None
512* @param          rsa_verify  [IN]   type #hi_cipher_rsa_verify *,Structure of the Rsa signature result
513*                              verification algorithm.CNcomment:Rsa签名结果校验算法结构体。CNend
514* @param          hash        [IN]   type #const hi_u8 *,Hash data to be checked.
515CNcomment:待校验的HASH数据。CNend
516* @param          hash_len    [IN]   type #hi_u32, Indicates the length of the hash data to be verified.
517*                              The value is 32 bytes valid data.
518CNcomment:待校验的HASH数据的长度,为32bytes有效数据。CNend
519* @param          sign        [IN]   type #const hi_u8 *,Signature input pointer.CNcomment:签名输入指针。CNend
520* @param          sign_len    [IN]   type #hi_u32,Length of the signature result. The length is the same as the
521*                              length of the key.CNcomment:签名结果长度, 长度与key的长度相同。CNend
522*
523* @retval         #0          Success
524* @retval         #Other      Failure, for details, see file hi_errno.h.
525* @par 依赖:
526*                 @li hi_cipher.h:Describes Cipher module APIs.
527CNcomment:文件用于描述Cipher模块相关接口。CNend
528* @see            hi_cipher_rsa_verify_hash。
529*/
530hi_u32 hi_cipher_rsa_verify_hash(const hi_cipher_rsa_verify *rsa_verify, const hi_u8 *hash, hi_u32 hash_len,
531    const hi_u8 *sign, hi_u32 sign_len);
532
533/**
534* @ingroup        iot_cipher
535* @brief          Ecdsa signature.CNcomment:Ecdsa 签名CNend
536*
537* @par 描述:
538*            Ecdsa signature and output of the signature result.CNcomment:Ecdsa 签名,输出签名结果。CNend
539*
540* @attention      None
541* @param          ecc          [IN]         type #const hi_cipher_ecc_param *,ECC elliptic curve parameter. If the
542*                              length is less than the size of the key, add 0 before the key.CNcomment:ECC椭圆曲线
543参数,长度不足Key的大小,前面补0。CNend
544* @param          sign         [IN/OUT]     type #const hi_cipher_ecc_sign *,Pointer to private key of ECDH.
545CNcomment:ECDH私钥签名结构体。CNend
546*
547* @retval         #0          Success
548* @retval         #Other      Failure, for details, see file hi_errno.h.
549* @par 依赖:
550*                 @li hi_cipher.h:Describes Cipher module APIs.
551CNcomment:文件用于描述Cipher模块相关接口。CNend
552* @see            hi_cipher_ecc_sign_hash。
553*/
554hi_u32 hi_cipher_ecc_sign_hash(const hi_cipher_ecc_param *ecc, const hi_cipher_ecc_sign *sign);
555
556/**
557* @ingroup        iot_cipher
558* @brief          Ecdsa Signature Verification.CNcomment:Ecdsa 签名结果校验CNend
559*
560* @par 描述:
561*                 Ecdsa Signature Verification.CNcomment:Ecdsa 签名结果校验。CNend
562*
563* @attention      None
564* @param          ecc          [IN]   type #const hi_cipher_ecc_param *,ECC elliptic curve parameter. If the length
565*                              is less than the size of the key, add 0 before the key.
566CNcomment:ECC椭圆曲线参数,长度不足Key的大小,前面补0。CNend
567* @param          verify       [IN]   type #const hi_cipher_ecc_verify *,Pointer to structure of the ECC public key
568*                              verification parameter.CNcomment:ECC公钥验证参数结构体。CNend
569*
570* @retval         #0          Success
571* @retval         #Other      Failure, for details, see file hi_errno.h.
572* @par 依赖:
573*                 @li hi_cipher.h:Describes Cipher module APIs.
574CNcomment:文件用于描述Cipher模块相关接口。CNend
575* @see            hi_cipher_ecc_sign_hash。
576*/
577hi_u32 hi_cipher_ecc_verify_hash(const hi_cipher_ecc_param *ecc, const hi_cipher_ecc_verify *verify);
578
579/**
580* @ingroup        iot_cipher
581* @brief          TRNG Obtain a random number.CNcomment:TRNG获取随机数CNend
582*
583* @par 描述:
584*                 TRNG Obtain a random number. Only one word size can be obtained at a time.
585CNcomment:TRNG获取随机数,每次只能获取一个WORD大小的随机数。CNend
586*
587* @attention      None
588* @param          randnum      [OUT]  type #hi_u32 *,Random number output pointer.
589CNcomment:随机数输出指针。CNend
590*
591* @retval         #0          Success
592* @retval         #Other      Failure, for details, see file hi_errno.h.
593* @par 依赖:
594*                 @li hi_cipher.h:Describes Cipher module APIs.
595CNcomment:文件用于描述Cipher模块相关接口。CNend
596* @see            hi_cipher_trng_get_random。
597*/
598hi_u32 hi_cipher_trng_get_random(hi_u32 *randnum);
599
600/**
601* @ingroup        iot_cipher
602* @brief          TRNG Obtain a random number.CNcomment:TRNG获取随机数CNend
603*
604* @par 描述:
605*                 The TRNG obtains the random number and obtains the random number of multiple bytes at a time.
606CNcomment:TRNG获取随机数,每次获取多个byte的随机数。CNend
607*
608* @attention      None
609* @param          randbyte     [OUT]  type #hi_u8 *,Random number output pointer.
610CNcomment:随机数输出指针。CNend
611* @param          size         [IN]   type #hi_u32,Length of the obtained random number.
612CNcomment:获取的随机数长度。CNend
613*
614* @retval         #0          Success
615* @retval         #Other      Failure, for details, see file hi_errno.h.
616* @par 依赖:
617*                 @li hi_cipher.h:Describes Cipher module APIs.
618CNcomment:文件用于描述Cipher模块相关接口。CNend
619* @see            hi_cipher_trng_get_random。
620*/
621hi_u32 hi_cipher_trng_get_random_bytes(hi_u8 *randbyte, hi_u32 size);
622
623/**
624* @ingroup        iot_cipher
625* @brief          Set the clock switch of cipher module.CNcomment:设置cipher模块时钟切换开关。CNend
626*
627* @par 描述:
628*                 Set the clock switch of cipher module, which is false by default, The clock is always on.
629When it is true, clock will be turned on when cipher algorithm is used and turned off when calculation is finished.
630CNcomment:设置cipher模块时钟切换开关,默认为FALSE,时钟常开,设为TRUE后在使用cipher算法时打开,计算结束后关闭。CNend
631*
632* @attention      None
633* @param          enable       [IN]  type #hi_bool,Random number output pointer.
634CNcomment:随机数输出指针。CNend
635*
636* @retval         None
637* @par 依赖:
638*                 @li hi_cipher.h:Describes Cipher module APIs.
639CNcomment:文件用于描述Cipher模块相关接口。CNend
640* @see            hi_cipher_set_clk_ctrl。
641*/
642hi_void hi_cipher_set_clk_switch(hi_bool enable);
643
644#ifdef __cplusplus
645#if __cplusplus
646}
647#endif
648#endif  /* __cplusplus */
649
650#endif /* __HI_CIPHER_H__ */
651
652