aboutsummaryrefslogtreecommitdiff
path: root/lib/sec_library/include/ecc.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sec_library/include/ecc.h')
-rw-r--r--lib/sec_library/include/ecc.h285
1 files changed, 285 insertions, 0 deletions
diff --git a/lib/sec_library/include/ecc.h b/lib/sec_library/include/ecc.h
new file mode 100644
index 00000000..4c0d3ebc
--- /dev/null
+++ b/lib/sec_library/include/ecc.h
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2017-2022 Alibaba Group Holding Limited
+ */
+
+/******************************************************************************
+ * @file drv/ecc.h
+ * @brief Header File for ECC Driver
+ * @version V3.3
+ * @date 30. May 2022
+ * @model ECC
+ ******************************************************************************/
+
+#ifndef _DRV_ECC_H_
+#define _DRV_ECC_H_
+
+#include <stdint.h>
+#include "common.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ECC_PRIME_CURVE_G_BYTES 64
+#define ECC_PRIME_CURVE_P_BYTES 70
+
+typedef struct {
+ uint32_t ecc_curve : 1; ///< supports 256bits curve
+} ecc_capabilities_t;
+
+/**
+\brief ECC ciphertext order
+*/
+typedef enum {
+ ECC_C1C3C2 = 0,
+ ECC_C1C2C3,
+} ecc_cipher_order_e;
+
+typedef enum {
+ ECC_ENDIAN_LITTLE = 0, ///< Little Endian
+ ECC_ENDIAN_BIG ///< Big Endian
+} ecc_endian_mode_e;
+
+typedef enum {
+ ECC_PRIME256V1 = 0,
+} ecc_prime_curve_type;
+
+/**
+\brief ECC key exchange role
+*/
+typedef enum { ECC_Role_Sponsor = 0, ECC_Role_Responsor } ecc_exchange_role_e;
+
+/****** ECC Event *****/
+typedef enum {
+ ECC_EVENT_MAKE_KEY_COMPLETE = 0, ///< Make key completed
+ ECC_EVENT_ENCRYPT_COMPLETE, ///< Encrypt completed
+ ECC_EVENT_DECRYPT_COMPLETE, ///< Decrypt completed
+ ECC_EVENT_SIGN_COMPLETE, ///< Sign completed
+ ECC_EVENT_VERIFY_COMPLETE, ///< Verify completed
+ ECC_EVENT_EXCHANGE_KEY_COMPLETE, ///< Exchange key completed
+} ecc_event_e;
+
+typedef struct {
+ ecc_prime_curve_type type;
+ uint32_t *p;
+} csi_ecc_prime_curve_t;
+
+typedef struct {
+ ecc_prime_curve_type type;
+ uint8_t *G;
+ uint8_t *n;
+} csi_ecc_curve_g_t;
+
+/**
+\brief ECC status
+*/
+typedef struct {
+ uint32_t busy : 1; ///< Calculate busy flag
+} csi_ecc_state_t;
+
+typedef struct {
+ csi_dev_t dev;
+ void * cb;
+ void * arg;
+ csi_ecc_state_t state;
+ ecc_prime_curve_type type;
+} csi_ecc_t;
+
+///< Pointer to \ref csi_ecc_callback_t : ECC Event call back.
+typedef void (*csi_ecc_callback_t)(ecc_event_e event);
+
+/**
+ \brief Initialize ECC.
+ \param[in] ecc ecc handle to operate.
+ \param[in] idx device id
+ \return \ref uint32_t
+*/
+csi_error_t csi_ecc_init(csi_ecc_t *ecc, uint32_t idx);
+
+/**
+ \brief De-initialize ECC Interface. stops operation and releases the software resources used by the interface
+ \param[in] ecc ecc handle to operate.
+ \return none
+*/
+void csi_ecc_uninit(csi_ecc_t *ecc);
+
+/**
+ \brief ecc get capability.
+ \param[in] ecc Operate handle.
+ \return \ref uint32_t
+*/
+csi_error_t csi_ecc_config(csi_ecc_t *ecc, ecc_cipher_order_e co,
+ ecc_endian_mode_e endian);
+
+/**
+ \brief Attach the callback handler to ECC
+ \param[in] ecc Operate handle.
+ \param[in] cb Callback function
+ \param[in] arg User can define it by himself as callback's param
+ \return Error code \ref csi_error_t
+*/
+csi_error_t csi_ecc_attach_callback(csi_ecc_t *ecc, csi_ecc_callback_t cb,
+ void *arg);
+
+/**
+ \brief Detach the callback handler
+ \param[in] ecc Operate handle.
+*/
+csi_error_t csi_ecc_detach_callback(csi_ecc_t *ecc);
+
+/**
+ \brief ecc get capability.
+ \param[in] ecc Operate handle.
+ \param[out] cap Pointer of ecc_capabilities_t.
+ \return \ref uint32_t
+*/
+csi_error_t csi_ecc_get_capabilities(csi_ecc_t *ecc, ecc_capabilities_t *cap);
+
+csi_error_t csi_ecc_check_keypair(csi_ecc_t *ecc, uint8_t pubkey[65], uint8_t prikey[32]);
+
+/**
+ \brief generate ecc key.
+ \param[in] ecc ecc handle to operate.
+ \param[out] private Pointer to the ecc private key, alloc by caller.
+ \param[out] public Pointer to the ecc public key, alloc by caller.
+ \return \ref uint32_t
+*/
+csi_error_t csi_ecc_gen_key(csi_ecc_t *ecc, uint8_t pubkey[65],
+ uint8_t prikey[32]);
+
+/**
+ \brief generate ecc pubkey by privkey.
+ \param[in] ecc ecc handle to operate.
+ \param[in] private Pointer to the ecc private key, alloc by caller.
+ \param[out] public Pointer to the ecc public key, alloc by caller.
+ \return \ref uint32_t
+*/
+csi_error_t csi_ecc_gen_pubkey(csi_ecc_t *ecc, uint8_t pubkey[65],
+ uint8_t prikey[32]);
+
+/**
+ \brief ecc sign
+ \param[in] ecc ecc handle to operate.
+ \param[in] d Pointer to the digest.
+ \param[out] privkey Pointer to the private key
+ \param[out] s Pointer to the signature
+ \return \ref uint32_t
+*/
+csi_error_t csi_ecc_sign(csi_ecc_t *ecc, uint8_t d[32], uint8_t prikey[32],
+ uint8_t s[64]);
+
+/**
+ \brief ecc sign
+ \param[in] ecc ecc handle to operate.
+ \param[in] d Pointer to the digest.
+ \param[out] privkey Pointer to the private key
+ \param[out] s Pointer to the signature
+ \return \ref uint32_t
+*/
+csi_error_t csi_ecc_sign_async(csi_ecc_t *ecc, uint8_t d[32],
+ uint8_t prikey[32], uint8_t s[64]);
+
+/* TODO */
+/**
+ \brief ecc verify
+ \param[in] ecc ecc handle to operate.
+ \param[in] d Pointer to the digest.
+ \param[out] privkey Pointer to the private key
+ \param[out] s Pointer to the signature
+ \return verify result
+*/
+bool csi_ecc_verify(csi_ecc_t *ecc, uint8_t d[32], uint8_t pubkey[65],
+ uint8_t s[64]);
+
+/**
+ \brief ecc verify
+ \param[in] ecc ecc handle to operate.
+ \param[in] d Pointer to the digest.
+ \param[out] privkey Pointer to the private key
+ \param[out] s Pointer to the signature
+ \return verify result
+*/
+bool csi_ecc_verify_async(csi_ecc_t *ecc, uint8_t d[32], uint8_t pubkey[65],
+ uint8_t s[64]);
+
+/**
+ \brief ecc encrypto
+ \param[in] ecc ecc handle to operate.
+ \param[in] Plain Pointer to the plaintext.
+ \param[in] PlainByteLen plaintext len
+ \param[in] pubKey public key.
+ \param[out] Cipher Pointer to the chipher
+ \param[out] CipherByteLen Pointer to the chipher len.
+ \return uint32_t
+*/
+csi_error_t csi_ecc_encrypt(csi_ecc_t *ecc, uint8_t *Plain,
+ uint32_t PlainByteLen, uint8_t pubKey[65],
+ uint8_t *Cipher, uint32_t *CipherByteLen);
+
+/**
+ \brief ecc encrypto
+ \param[in] ecc ecc handle to operate.
+ \param[in] Cipher Pointer to the chipher
+ \param[in] CipherByteLen chipher len.
+ \param[in] prikey private key.
+ \param[out] Plain Pointer to the plaintext.
+ \param[out] PlainByteLen plaintext len
+ \return uint32_t
+*/
+csi_error_t csi_ecc_decrypt(csi_ecc_t *ecc, uint8_t *Cipher,
+ uint32_t CipherByteLen, uint8_t prikey[32],
+ uint8_t *Plain, uint32_t *PlainByteLen);
+
+/**
+ \brief ecc key exchange
+ \param[in] ecc ecc handle to operate.
+ \return uint32_t
+*/
+csi_error_t csi_ecc_exchangekey(csi_ecc_t *ecc, ecc_exchange_role_e role,
+ uint8_t *dA, uint8_t *PB, uint8_t *rA,
+ uint8_t *RA, uint8_t *RB, uint8_t *ZA,
+ uint8_t *ZB, uint32_t kByteLen, uint8_t *KA,
+ uint8_t *S1, uint8_t *SA);
+
+/**
+ \brief ecc key exchange get Z.
+ \param[in] ecc ecc handle to operate.
+ \return uint32_t
+*/
+csi_error_t csi_ecc_getZ(csi_ecc_t *ecc, uint8_t *ID, uint32_t byteLenofID,
+ uint8_t pubKey[65], uint8_t Z[32]);
+
+/**
+ \brief ecc key exchange get E
+ \param[in] ecc ecc handle to operate.
+ \return uint32_t
+*/
+csi_error_t csi_ecc_getE(csi_ecc_t *ecc, uint8_t *M, uint32_t byteLen,
+ uint8_t Z[32], uint8_t E[32]);
+
+/**
+ \brief Get ECC state.
+ \param[in] ecc ECC handle to operate.
+ \param[out] state ECC state \ref csi_ecc_state_t.
+ \return Error code \ref csi_error_t
+*/
+csi_error_t csi_ecc_get_state(csi_ecc_t *ecc, csi_ecc_state_t *state);
+
+/**
+ \brief Enable ecc power manage
+ \param[in] ecc ECC handle to operate.
+ \return Error code \ref csi_error_t
+*/
+csi_error_t csi_ecc_enable_pm(csi_ecc_t *ecc);
+
+/**
+ \brief Disable ecc power manage
+ \param[in] ecc ECC handle to operate.
+*/
+void csi_ecc_disable_pm(csi_ecc_t *ecc);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#endif \ No newline at end of file