194 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			194 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | /*
 | ||
|  |  * 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
 |