Files
kunlun/export/inc/crypto/iot_crypto_dsa_api.h
2024-09-28 14:24:04 +08:00

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 */