248 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | |
| 
 | |
| This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | |
| be copied by any method or incorporated into another program without
 | |
| the express written consent of Aerospace C.Power. This Information or any portion
 | |
| thereof remains the property of Aerospace C.Power. The Information contained herein
 | |
| is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | |
| liability for its use in any way and conveys no license or title under
 | |
| any patent or copyright and makes no representation or warranty that this
 | |
| Information is free from patent or copyright infringement.
 | |
| 
 | |
| ****************************************************************************/
 | |
| #ifndef IOT_CRYPTO_DSA_API_H
 | |
| #define IOT_CRYPTO_DSA_API_H
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #include "iot_crypto_error_api.h"
 | |
| 
 | |
| /* define ECDSA elliptic curve type  */
 | |
| typedef enum {
 | |
|     ecdsa_ecp_bp256r1 = 0x0,
 | |
| } ecdsa_ecp_t;
 | |
| 
 | |
| #define G_SIZE_INBYTES          (32)
 | |
| #define SM3_RESULT_SIZE         (32)
 | |
| 
 | |
| typedef struct _sm2_exchange_info_t{
 | |
|     uint32_t keylen;
 | |
|     uint8_t za[SM3_RESULT_SIZE];
 | |
|     uint8_t zb[SM3_RESULT_SIZE];
 | |
|     uint8_t s1[SM3_RESULT_SIZE];
 | |
|     uint8_t s2[SM3_RESULT_SIZE];
 | |
|     void    *sm2_exchange_data;
 | |
|     uint8_t *keygen;
 | |
|     uint8_t *tmpbuf;
 | |
| }sm2_exchange_info_t;
 | |
| 
 | |
| typedef struct _ecp_point_t{
 | |
|     uint8_t x[G_SIZE_INBYTES];
 | |
|     uint8_t y[G_SIZE_INBYTES];
 | |
| }ecp_point_t;
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_ecdsa_gen_keypair() - generate key pair.
 | |
|  * @param ecp: curve type, see ecdsa_ecp_t.
 | |
|  * @param public_key: returns the generated public key
 | |
|  * @param public_key_len: returns the generated public key len
 | |
|  * @param pri_key: returns the generated private  key
 | |
|  * @param pri_key_len: returns the generated private key len
 | |
|  *
 | |
|  * @retval: error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_ecdsa_gen_keypair(
 | |
|     ecdsa_ecp_t ecp, uint8_t *public_key, uint32_t *public_key_len,
 | |
|     uint8_t *pri_key, uint32_t *pri_key_len);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_ecdsa_with_sha256_sign() - ESDA signature, message hash
 | |
|  *        algorithm is SHA256.
 | |
|  * @param ecp: curve type, see ecdsa_ecp_t.
 | |
|  * @param msg: message to be signed
 | |
|  * @param len: message len
 | |
|  * @param pri_key: private key
 | |
|  * @param pri_key_len: private key len
 | |
|  * @param r_buf: return the generated signature information r part
 | |
|  * @param r_buf_len: r part len.
 | |
|  * @param s_buf: return the generated signature information s part
 | |
|  * @param s_buf_len: s part len.
 | |
|  *
 | |
|  * @retval: error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_ecdsa_with_sha256_sign(ecdsa_ecp_t ecp,
 | |
|     const uint8_t *msg, uint32_t len,
 | |
|     const uint8_t *pri_key, uint32_t pri_key_len,
 | |
|     uint8_t *r_buf, uint32_t *r_buf_len,
 | |
|     uint8_t *s_buf, uint32_t *s_buf_len);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_ecdsa_with_sha256_sign_verify() - ESDA signature verify,
 | |
|  *        message hash algorithm is SHA256.
 | |
|  * @param ecp: curve type, see ecdsa_ecp_t.
 | |
|  * @param msg: original message to be signed verify
 | |
|  * @param len: original message len
 | |
|  * @param public_key: pointer public key
 | |
|  * @param public_key_len: public key len
 | |
|  * @param r_buf: signature info r part for verification
 | |
|  * @param r_buf_len: r part len
 | |
|  * @param s_buf: signature info s part for verification
 | |
|  * @param s_buf_len: s part len
 | |
|  *
 | |
|  * @retval: error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_ecdsa_with_sha256_sign_verify(ecdsa_ecp_t ecp,
 | |
|     const uint8_t *msg, uint32_t len,
 | |
|     const uint8_t *public_key, uint32_t public_key_len,
 | |
|     const uint8_t *r_buf, uint32_t r_buf_len,
 | |
|     const uint8_t *s_buf, uint32_t s_buf_len);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_sign() - signature with pub key and private key
 | |
|  * @param r         signature r
 | |
|  * @param rlen      signature r len
 | |
|  * @param s         signature s
 | |
|  * @param slen      signature s len
 | |
|  *
 | |
|  * @retval:         error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_sign(uint8_t *message, uint32_t message_size,
 | |
|     uint8_t *ID, uint32_t ID_len, uint8_t *public_key, uint32_t public_key_len,
 | |
|     uint8_t *r, uint32_t *rlen, uint8_t *s, uint32_t *slen, uint8_t *private_key,
 | |
|     uint32_t private_key_len);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_verify() - verify signature
 | |
|  * @param r         signature r
 | |
|  * @param rlen      signature r len
 | |
|  * @param s         signature s
 | |
|  * @param slen      signature s len
 | |
|  *
 | |
|  * @retval:         error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_verify(uint8_t *message, uint32_t message_size,
 | |
|     uint8_t *ID, uint32_t ID_len, uint8_t *public_key, uint32_t public_key_len,
 | |
|     uint8_t *r, uint32_t rlen, uint8_t *s, uint32_t slen);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_gen_keypair() - gen keypair include pub key and pri key
 | |
|  * @param public_key_len       input public_key buf len && output pub_key len
 | |
|  * @param private_key_len      input private_key buf len && output pri_key len
 | |
|  *
 | |
|  * @retval:                    error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_gen_keypair(uint8_t *public_key,
 | |
|     uint32_t *public_key_len, uint8_t *private_key, uint32_t *private_key_len);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_gen_share_key() -  calc share key by pub key and pri key
 | |
|  * @pub_key:           public key, Fixed 64 bytes
 | |
|  * @pri_key:           private key, Fixed 32 bytes
 | |
|  * @gen_key:           buffer to store generated key
 | |
|  * @gen_key_len        The size of the gen_key
 | |
|  *
 | |
|  * @retval:            error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_gen_share_key(uint8_t *pub_key, uint8_t *pri_key,
 | |
|     uint8_t *gen_key, uint32_t gen_key_len);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_encrypt() - sm2 encrypt
 | |
|  * @param message_plain:           plain text
 | |
|  * @param message_size:            plain size
 | |
|  * @param cipher_text:             buffer to store cipher text
 | |
|  * @param ciphertext_len:          cipher buffer len
 | |
|  * @param pubkey:                  public key
 | |
|  *
 | |
|  * @retval:                        error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_encrypt(uint8_t* message_plain, uint32_t message_size,
 | |
|     uint8_t* cipher_text, uint32_t *ciphertext_len, uint8_t *pubkey);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_decrypt() - sm2_decrypt
 | |
|  * @param cipher_text:             cipher text
 | |
|  * @param ciphertext_len:          cipher text len
 | |
|  * @param message_plain:           buffer to store Plain text
 | |
|  * @param message_size:            plain size
 | |
|  * @param prikey:                  private key
 | |
|  *
 | |
|  * @retval:                        error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_decrypt(uint8_t* cipher_text, uint32_t ciphertext_len,
 | |
|     uint8_t* message_plain, uint32_t *message_size, uint8_t *prikey);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_exchange_info_init() - sm2_info init
 | |
|  * @param pub_key_a:            public key A
 | |
|  * @param pub_key_a_len:        public key A len
 | |
|  * @param pub_key_b:            public key B
 | |
|  * @param pub_key_b_len:        public key B len
 | |
|  * @param pri_key:              private key
 | |
|  * @param pri_key_len:          private key len
 | |
|  * @param key_len_in_bits:      generate key len in bits
 | |
|  * @param sm2_info:             parameter set
 | |
|  *
 | |
|  * @retval:                     error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_exchange_info_init(uint8_t *pub_key_a,
 | |
|     uint32_t pub_key_a_len,uint8_t *pub_key_b, uint32_t pub_key_b_len,
 | |
|     uint8_t *pri_key, uint32_t pri_key_len, uint32_t key_len_in_bits,
 | |
|     sm2_exchange_info_t *sm2_info);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_exchange_info_init() -  sm2_info deinit
 | |
|  * @param sm2_info:            parameter set
 | |
|  */
 | |
| void iot_crypto_sm2_exchange_info_deinit(sm2_exchange_info_t *sm2_info);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_exchange_req_step1() - request exchange step1
 | |
|  * @param ida:                 a's id
 | |
|  * @param ida_len:             a's id len
 | |
|  * @param idb:                 b's id
 | |
|  * @param idb_len:             b's id len
 | |
|  * @param ra:                  generate ecp point
 | |
|  * @param sm2_info:            parameter set
 | |
|  *
 | |
|  * @retval:                    error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_exchange_req_step1(uint8_t *ida, uint32_t ida_len,
 | |
|     uint8_t *idb, uint32_t idb_len, ecp_point_t *ra,
 | |
|     sm2_exchange_info_t *sm2_info);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_exchange_req_step2() - request exchange step2
 | |
|  * @param rb:                  response generate info
 | |
|  * @param sm2_info:            parameter set
 | |
|  *
 | |
|  * @retval:                    error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_exchange_req_step2(ecp_point_t *rb,
 | |
|     sm2_exchange_info_t *sm2_info);
 | |
| 
 | |
| /**
 | |
|  * @brief iot_crypto_sm2_exchange_response_step1() - response exchange step1
 | |
|  * @param ida:                 a's id
 | |
|  * @param ida_len:             a's id len
 | |
|  * @param idb:                 b's id
 | |
|  * @param idb_len:             b's id len
 | |
|  * @param ra:                  request generate info
 | |
|  * @param rb:                  response generate info
 | |
|  * @param sm2_info:            parameter set
 | |
|  *
 | |
|  * @retval:                    error code. see CRYPTO_RET_XXX
 | |
|  */
 | |
| uint32_t iot_crypto_sm2_exchange_response_step1(uint8_t *ida, uint32_t ida_len,
 | |
|     uint8_t *idb, uint32_t idb_len, ecp_point_t *ra, ecp_point_t *rb,
 | |
|     sm2_exchange_info_t *sm2_info);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif /* IOT_CRYPTO_DSA_API_H */ |