194 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * Copyright (c) 2006-2023, RT-Thread Development Team
 | |
|  *
 | |
|  * SPDX-License-Identifier: Apache-2.0
 | |
|  *
 | |
|  * Change Logs:
 | |
|  * Date           Author       Notes
 | |
|  * 2019-04-23     tyx          the first version
 | |
|  */
 | |
| 
 | |
| #ifndef __HWCRYPTO_H__
 | |
| #define __HWCRYPTO_H__
 | |
| 
 | |
| #include <rtthread.h>
 | |
| 
 | |
| #ifndef RT_HWCRYPTO_DEFAULT_NAME
 | |
| #define RT_HWCRYPTO_DEFAULT_NAME    ("hwcryto")
 | |
| #endif
 | |
| 
 | |
| #define HWCRYPTO_MAIN_TYPE_MASK     (0xffffUL << 16)
 | |
| #define HWCRYPTO_SUB_TYPE_MASK      (0xffUL << 8)
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|     HWCRYPTO_TYPE_NULL = 0x00000000,
 | |
| 
 | |
|     /* Main Type */
 | |
|     /* symmetric Type */
 | |
|     HWCRYPTO_TYPE_HEAD    = __LINE__,
 | |
|     HWCRYPTO_TYPE_AES     = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< AES */
 | |
|     HWCRYPTO_TYPE_DES     = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< DES */
 | |
|     HWCRYPTO_TYPE_3DES    = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< 3DES */
 | |
|     HWCRYPTO_TYPE_RC4     = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< RC4 */
 | |
|     HWCRYPTO_TYPE_GCM     = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< GCM */
 | |
|     /* HASH Type */
 | |
|     HWCRYPTO_TYPE_MD5     = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< MD5 */
 | |
|     HWCRYPTO_TYPE_SHA1    = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< SHA1 */
 | |
|     HWCRYPTO_TYPE_SHA2    = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< SHA2 */
 | |
|     /* Other Type */
 | |
|     HWCRYPTO_TYPE_RNG     = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< RNG */
 | |
|     HWCRYPTO_TYPE_CRC     = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< CRC */
 | |
|     HWCRYPTO_TYPE_BIGNUM  = ((__LINE__ - HWCRYPTO_TYPE_HEAD) & 0xffff) << 16,  /**< BIGNUM */
 | |
| 
 | |
|     /* AES Subtype */
 | |
|     HWCRYPTO_TYPE_AES_ECB = HWCRYPTO_TYPE_AES | (0x01 << 8),
 | |
|     HWCRYPTO_TYPE_AES_CBC = HWCRYPTO_TYPE_AES | (0x02 << 8),
 | |
|     HWCRYPTO_TYPE_AES_CFB = HWCRYPTO_TYPE_AES | (0x03 << 8),
 | |
|     HWCRYPTO_TYPE_AES_CTR = HWCRYPTO_TYPE_AES | (0x04 << 8),
 | |
|     HWCRYPTO_TYPE_AES_OFB = HWCRYPTO_TYPE_AES | (0x05 << 8),
 | |
| 
 | |
|     /* DES Subtype */
 | |
|     HWCRYPTO_TYPE_DES_ECB = HWCRYPTO_TYPE_DES | (0x01 << 8),
 | |
|     HWCRYPTO_TYPE_DES_CBC = HWCRYPTO_TYPE_DES | (0x02 << 8),
 | |
| 
 | |
|     /* 3DES Subtype */
 | |
|     HWCRYPTO_TYPE_3DES_ECB = HWCRYPTO_TYPE_3DES | (0x01 << 8),
 | |
|     HWCRYPTO_TYPE_3DES_CBC = HWCRYPTO_TYPE_3DES | (0x02 << 8),
 | |
| 
 | |
|     /* SHA2 Subtype */
 | |
|     HWCRYPTO_TYPE_SHA224 = HWCRYPTO_TYPE_SHA2 | (0x01 << 8),
 | |
|     HWCRYPTO_TYPE_SHA256 = HWCRYPTO_TYPE_SHA2 | (0x02 << 8),
 | |
|     HWCRYPTO_TYPE_SHA384 = HWCRYPTO_TYPE_SHA2 | (0x03 << 8),
 | |
|     HWCRYPTO_TYPE_SHA512 = HWCRYPTO_TYPE_SHA2 | (0x04 << 8),
 | |
| } hwcrypto_type;
 | |
| 
 | |
| typedef enum
 | |
| {
 | |
|     HWCRYPTO_MODE_ENCRYPT = 0x1,        /**< Encryption operations */
 | |
|     HWCRYPTO_MODE_DECRYPT = 0x2,        /**< Decryption operations */
 | |
|     HWCRYPTO_MODE_UNKNOWN = 0x7fffffff, /**< Unknown */
 | |
| } hwcrypto_mode;
 | |
| 
 | |
| struct rt_hwcrypto_ctx;
 | |
| 
 | |
| struct rt_hwcrypto_ops
 | |
| {
 | |
|     rt_err_t (*create)(struct rt_hwcrypto_ctx *ctx);        /**< Creating hardware context */
 | |
|     void (*destroy)(struct rt_hwcrypto_ctx *ctx);           /**< Delete hardware context */
 | |
|     rt_err_t (*copy)(struct rt_hwcrypto_ctx *des,
 | |
|                      const struct rt_hwcrypto_ctx *src);    /**< Cpoy hardware context */
 | |
|     void (*reset)(struct rt_hwcrypto_ctx *ctx);             /**< Reset hardware context */
 | |
| };
 | |
| 
 | |
| struct rt_hwcrypto_device
 | |
| {
 | |
|     struct rt_device parent;                            /**< Inherited from the standard device */
 | |
|     const struct rt_hwcrypto_ops *ops;                  /**< Hardware crypto ops */
 | |
|     rt_uint64_t id;                                     /**< Unique id */
 | |
|     void *user_data;                                    /**< Device user data */
 | |
| };
 | |
| 
 | |
| struct rt_hwcrypto_ctx
 | |
| {
 | |
|     struct rt_hwcrypto_device *device;  /**< Binding device */
 | |
|     hwcrypto_type type;                 /**< Encryption and decryption types */
 | |
|     void *contex;                       /**< Hardware context */
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief           Setting context type (Direct calls are not recommended)
 | |
|  *
 | |
|  * @param ctx       Crypto context
 | |
|  * @param type      Types of settings
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_set_type(struct rt_hwcrypto_ctx *ctx, hwcrypto_type type);
 | |
| 
 | |
| /**
 | |
|  * @brief           Reset context type (Direct calls are not recommended)
 | |
|  *
 | |
|  * @param ctx       Crypto context
 | |
|  */
 | |
| void rt_hwcrypto_ctx_reset(struct rt_hwcrypto_ctx *ctx);
 | |
| 
 | |
| /**
 | |
|  * @brief           Init crypto context (Direct calls are not recommended)
 | |
|  *
 | |
|  * @param ctx       The context to initialize
 | |
|  * @param device    Hardware crypto device
 | |
|  * @param type      Type of context
 | |
|  * @param obj_size  Size of context object
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_ctx_init(struct rt_hwcrypto_ctx *ctx,
 | |
|                               struct rt_hwcrypto_device *device, hwcrypto_type type);
 | |
| 
 | |
| /**
 | |
|  * @brief           Create crypto context (Direct calls are not recommended)
 | |
|  *
 | |
|  * @param device    Hardware crypto device
 | |
|  * @param type      Type of context
 | |
|  * @param obj_size  Size of context object
 | |
|  *
 | |
|  * @return          Crypto context
 | |
|  */
 | |
| struct rt_hwcrypto_ctx *rt_hwcrypto_ctx_create(struct rt_hwcrypto_device *device,
 | |
|                                                hwcrypto_type type, rt_uint32_t obj_size);
 | |
| 
 | |
| /**
 | |
|  * @brief           Destroy crypto context (Direct calls are not recommended)
 | |
|  *
 | |
|  * @param device    Crypto context
 | |
|  */
 | |
| void rt_hwcrypto_ctx_destroy(struct rt_hwcrypto_ctx *ctx);
 | |
| 
 | |
| /**
 | |
|  * @brief           Copy crypto context (Direct calls are not recommended)
 | |
|  *
 | |
|  * @param des       The destination context
 | |
|  * @param src       The context to be copy
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_ctx_cpy(struct rt_hwcrypto_ctx *des, const struct rt_hwcrypto_ctx *src);
 | |
| 
 | |
| /**
 | |
|  * @brief           Register hardware crypto device
 | |
|  *
 | |
|  * @param device    Hardware crypto device
 | |
|  * @param name      Name of device
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_register(struct rt_hwcrypto_device *device, const char *name);
 | |
| 
 | |
| /**
 | |
|  * @brief           Get the default hardware crypto device
 | |
|  *
 | |
|  * @return          Hardware crypto device
 | |
|  *
 | |
|  */
 | |
| struct rt_hwcrypto_device *rt_hwcrypto_dev_default(void);
 | |
| 
 | |
| /**
 | |
|  * @brief           Get the unique ID of the device
 | |
|  *
 | |
|  * @param device    Device object
 | |
|  *
 | |
|  * @return          Device unique ID
 | |
|  */
 | |
| rt_uint64_t rt_hwcrypto_id(struct rt_hwcrypto_device *device);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 |